Compare commits

...

41 Commits

Author SHA1 Message Date
Scott Walters
c35791c506 Merge pull request #2 from rejitnatarajan/pod-fix
missing asterisk fixes pod error
2015-02-11 22:46:16 -06:00
rejit natarajan
b803f83abd missing asterisk fixes pod error
small fix for pod error http://cpants.cpanauthors.org/dist/SOAP-WSDL/errors
2015-02-12 09:55:29 +05:30
Scott Walters
e95ff8baba Changelog entries for 3.002, too late for release. oops. and what exactly where the 3.001 changes? oh well. 2014-09-16 17:49:01 -04:00
Scott Walters
cad782dbf2 bump version to 3.002, and also change each file from having their own version number to referring to $SOAP::WSDL::VERSION since they aren't really individually versions anyway but just copies of that number. 2014-09-16 17:40:18 -04:00
Scott Walters
99c5eb4dd7 remove META.yml (I still don't know how that's supposed to work) and Makefile (which I do know wasn't supposed to be in git) 2014-09-16 03:30:20 -04:00
Scott Walters
a1e9927846 Declare dependency on Class::Load
Thanks ANDYK!
Ref Bug #98628 for SOAP-WSDL: Undeclared dependency on Class::Load
https://rt.cpan.org/Public/Bug/Display.html?id=98628
2014-09-16 03:30:20 -04:00
Scott Walters
ba407622f5 Merge pull request #1 from szabgab/patch-1
link to GitHub from META files
2014-08-30 03:52:40 -04:00
Gabor Szabo
5b9f3c640b link to GitHub from META files 2014-08-30 10:27:21 +03:00
Scott Walters
ed715a4c88 smoke testing looks pretty good, only failing on amd64-netbsd machines and one random Linux machine (I should look why but I really don't want to know), so, bump version to 3.001 and do a release.
FAIL    5.10.1  NetBSD  6.1.4   amd64-netbsd
FAIL    5.14.2  GNU/Linux       3.11.0-18-generic       x86_64-linux-thread-multi
FAIL    5.10.1  NetBSD  6.1.4   amd64-netbsd-thread-multi
2014-08-29 15:05:06 -04:00
Scott Walters
f5787f6057 version bump to 3.00.0_2 and Changes entry 2014-08-28 21:16:50 -04:00
Scott Walters
374793ef68 get rid of Build.PL; we use ExtUtils::MakeMaker now. 2014-08-28 21:08:13 -04:00
Scott Walters
7f6af60ed8 oops, global version search and replace ruined a comment. leave it ruined 2014-08-28 21:05:13 -04:00
Scott Walters
37740b870a fix a hash randomization bug that was causing random failures in t/SOAP/WSDL/05_simpleType-list.t 2014-08-28 21:03:39 -04:00
Scott Walters
31f5deacf5 2624a9 for #86142, adding the XML declaration to the output, broke another part of the system, so work around that.
I accidentally stopped doing "recursive" tests (tests in subdirs) at some point and missed some of this fun breakage.
2014-08-28 21:01:51 -04:00
Scott Walters
3197383a7d update POD; thought I commit this already... ? 2014-08-28 20:38:31 -04:00
Scott Walters
285ffa463c okay, dam@cpan.org's fix for using not using ->usa('UNIVERSAL') to test if something loaded apparently works in a situation where mine doesn't, that was causing tests to fail. 2014-08-28 18:26:41 -04:00
Scott Walters
35321ce5d0 run tests recursively under ExtUtils::MakeMaker. 2014-08-28 16:25:55 -04:00
Scott Walters
08b156a546 take Module::Build out of inc. it doesn't work. don't use it. 2014-08-28 16:25:29 -04:00
Scott Walters
605732b836 https://rt.cpan.org/Ticket/Display.html?id=82028 -- POD error results in broken link generated 2014-08-27 18:28:43 -04:00
Scott Walters
1994b36d8b switch from Module::Build to Make::Maker based Makefile.PL after Module::Build vomited on trying to 'make dist', and then when that was fixed, generated a completely busted dist without error. good riddance. 2014-08-27 17:53:50 -04:00
Scott Walters
f3ae85aed5 default directory for t/098_pod.t. not sure why it was doing @dir = (); if(ENV var) { @dir = 'some dir that exists' }. this would make a path analysis tool cry. 2014-08-27 17:52:41 -04:00
Scott Walters
7d81cfce87 bump version to 3.00.00_1; update POD a bit; include contact info for myself; declare this module deprecated and in maintenance mode; include Module::Build in the 'inc' dir to avoid a warning about it being deprecated from core inclusion; add mention of the UNIVERSAL->isa() bug created by Class::Std::Fast to the POD for BUGS AND LIMITATIONS. 2014-08-27 17:39:52 -04:00
Scott Walters
2624a9d5c0 applied patch from ticket #86142: Missing XML declaration in request
https://rt.cpan.org/Public/Bug/Display.html?id=86142
tests still pass, so, good enough, right?
2014-08-21 20:50:56 -04:00
Scott Walters
45982ff330 Huh. Between 5.12 and 5.16 somewhere, the behavior of ClassName->isa('UNIVERSAL') changed.
It used to be that that would return true if and only if that namespace existed.
Now it always returns true for any random non-existant made up name.
Changed this to do ->can() on a known existing method modules with this API have (serialize)
instead after floundering around for a bit.  exists ${"main::"}{$type.'::'} worked a little
bit but made it barf for some reason I didn't investigate.
This is the problem apparently behind the previous "haunted house level shit" fixes and
reversions.  This thing does automatically load these modules on the fly.  Would be nice
if the unit tests had some comments in them.
2014-08-21 08:37:49 -04:00
Scott Walters
cfd5892b18 Revert "was barfing with "Can't locate object method "new" via package "MyElement" (perhaps you forgot to load "MyElement"?) at lib/SOAP/WSDL/XSD/Typelib/Comple"
ref haunted house level shit going weird message in previous revert.

This reverts commit d221e87b29.
2014-08-21 07:48:30 -04:00
Scott Walters
6e95d01610 Revert "maybe I'm doing the wrong thing by adding use lines for test modules"
Wow.  Even with the "fix" in, it runs correctly once, and then starts vomiting
with a similar error again as before the fix.  it'll fail 20 times in a
row, then pass 20 times in a row.  there's some haunted house level
shit going wrong here.

This reverts commit b121a061d8.
2014-08-21 07:47:02 -04:00
Scott Walters
b121a061d8 maybe I'm doing the wrong thing by adding use lines for test modules
that unit tests use.  maybe there's some magic that's supposed to
automatically use those things, even though they're hidden in deeply
buried paths with no machine predictable naming scheme.  I can't
imagine that these unit tests passed before unless there is/was
some magic.  I hobbled this in to working with a use lib and a
use for the module, but after doing this second one of these,
I'm having serious doubts about whether I'm just spackling over
the problem.
2014-08-21 07:37:22 -04:00
Scott Walters
d2f324a7f2 oops, changing error messages breaks tests. make them match again. don't change the tests. change the error messages. that way the error message's awkwardness hints at the code's awkwardness. 2014-08-21 07:34:19 -04:00
Scott Walters
f2ce9511e0 I don't get it. There were two calls to get_port() right next to
each other, in the very same ? :, and one of them had a ->[0]
tacked on the end and the other one didn't.  Well guess what...
the one without was returning an arrayref, which caused these
failures in the unit tests:
Can't call method "get_binding" on unblessed reference at /home/scott/projects/SOAP-WSDL/blib/lib/SOAP/WSDL.pm line 186.
2014-08-21 07:27:58 -04:00
Scott Walters
50c8d5b31f oh, look, ComplexType.pm has cut and paste hash reversing code
from SimpleType.pm.  that means that we can cut and paste the
fix from SimpleType.pm into ComplexType.pm.  how many wrongs
make a right?  I forget.
2014-08-21 07:26:30 -04:00
Scott Walters
47dc61bd9e protip: reverse %hash with '#default' => 'urn:myNamespace', 'tns' =>
'urn:myNamespace' results in misery.  random hash ordering made a pile of
tests in t/003_wsdl_based_serializer.t randomly pass and fail in unison.
I smelled a smell.
2014-08-21 06:32:11 -04:00
Scott Walters
3670df3e69 "vectors" (totally not the same thing as a vector in other languages or on a Cray 1)
have been deprecated and removed.  pretend like they never existed.
2014-08-21 05:20:56 -04:00
Scott Walters
d221e87b29 was barfing with "Can't locate object method "new" via package "MyElement" (perhaps you forgot to load "MyElement"?) at lib/SOAP/WSDL/XSD/Typelib/Comple
xType.pm line 213.".  Okay, then, MyElement.pm exists in t/lib.  Let's try
using it.  And it worked.  Incidentally, the code at lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm is heinous.
2014-08-21 05:17:05 -04:00
Scott Walters
001c36f8e8 fix two instances of the "Can't modify non-lvalue subroutine call at lib/SOAP/WSDL.pm line 167." error.
it looks like the author wrote

    return $a ? $b : $c = $d

Intending it to mean:

    return $a ? $b : ($c = $d);

... but perl parses it as:

    return ( $a ? $b : $c) = $d;

... and perl 5.16 is more astute about lvalue errors like that.
2014-08-20 08:37:33 -04:00
Martin Kutter
9023aa06a4 import SOAP-WSDL 2.00.10 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.10
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.10.tar.gz
2009-12-12 19:49:03 -08:00
Martin Kutter
3b30e8d0e2 import SOAP-WSDL 2.00.09 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.09
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.09.tar.gz
2009-12-12 19:49:02 -08:00
Martin Kutter
fb9fd4a2b1 import SOAP-WSDL 2.00.08 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.08
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.08.tar.gz
2009-12-12 19:49:00 -08:00
Martin Kutter
bfc3247583 import SOAP-WSDL 2.00.07 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.07
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.07.tar.gz
2009-12-12 19:48:57 -08:00
Martin Kutter
3de318be40 import SOAP-WSDL 2.00.06 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.06
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.06.tar.gz
2009-12-12 19:48:54 -08:00
Martin Kutter
c2ac24dd0f import SOAP-WSDL 2.00.05 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.05
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.05.tar.gz
2009-12-12 19:48:45 -08:00
Martin Kutter
c3e3d1908e import SOAP-WSDL 2.00.04 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.04
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.04.tar.gz
2009-12-12 19:48:44 -08:00
215 changed files with 6545 additions and 4860 deletions

View File

@@ -1,55 +0,0 @@
use Module::Build;
use version;
$build = Module::Build->new(
dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
create_makefile_pl => 'small',
dist_abstract => 'SOAP with WSDL support',
dist_name => 'SOAP-WSDL',
dist_version => '2.00.03',
module_name => 'SOAP::WSDL',
license => 'artistic',
requires => {
# 5.6.x is way too buggy and has no unicode support
# for us. SOAP-WSDL relies on unicode (WS-I demands it)
# and triggers several 5.6 bugs...
'perl' => q(5.8.0),
'Class::Std::Fast' => q(0.0.5),
'Data::Dumper' => 0,
'Date::Parse' => 0,
'Date::Format' => 0,
'File::Basename' => 0,
'File::Path' => 0,
'Getopt::Long' => 0,
'List::Util' => 0,
'LWP::UserAgent' => 0,
'Template' => q(2.18),
'Term::ReadKey' => 0,
'URI' => 0,
'XML::Parser::Expat' => 0,
},
build_requires => {
'Class::Std::Fast' => q(0.0.5),
'Cwd' => 0,
'Date::Parse' => 0,
'Date::Format' => 0,
'Getopt::Long' => 0,
'List::Util' => 0,
'LWP::UserAgent' => 0,
'Module::Build' => 0,
'File::Basename' => 0,
'File::Path' => 0,
'File::Spec' => 0,
'Storable' => 0,
'Test::More' => 0,
'Template' => q(2.18),
'XML::Parser::Expat' => 0,
},
recursive_test_files => 1,
meta_add => {
no_index => {
directory => 'lib/SOAP/WSDL/Generator/Template/XSD/',
},
}
);
$build->add_build_element('tt');
$build->create_build_script;

252
Changes
View File

@@ -1,4 +1,66 @@
Release notes for SOAP::WSDL 2.00.03
Release notes for SOAP::WSDL 3.002
o. change each file from having their own version number to referring to $SOAP::WSDL::VERSION since they aren't really individually versions anyway but just copies of that numbe
o. Declare dependency on Class::Load -- thanks ANDYK
o. link to GitHub from META files -- thanks szabgab
Release notes for SOAP::WSDL 3.00.00_1
-------
o. fix a hash randomization bug that was causing random failures in t/SOAP/WSDL/05_simpleType-list.t
o. 2624a9 for #86142, adding the XML declaration to the output, broke another part of the system, so work around that.
I accidentally stopped doing "recursive" tests (tests in subdirs) at some point and missed some of this fun breakage.
o. dam@cpan.org's fix for using not using ->usa('UNIVERSAL') to test if something loaded apparently works in a situation
where mine doesn't, that was causing tests to fail; use that version instead.
Release notes for SOAP::WSDL 3.00.00_1
-------
Scott Walters has assumed co-maint of this module and is ashamed to release 3.00.00_1.
Numerous fixes have been made to get tests to pass again on newer perls.
Please see the git log at http://github.com/scrottie/SOAP-WSDL for additional detail.
o. applied patch from ticket #86142: Missing XML declaration in request
https://rt.cpan.org/Public/Bug/Display.html?id=86142
tests still pass, so, good enough, right?
o. Huh. Between 5.12 and 5.16 somewhere, the behavior of ClassName->isa('UNIVERSAL') changed.
It used to be that that would return true if and only if that namespace existed.
Now it always returns true for any random non-existant made up name.
Changed this to do ->can() on a known existing method modules with this API have (serialize)
instead after floundering around for a bit. exists ${"main::"}{$type.'::'} worked a little
bit but made it barf for some reason I didn't investigate.
This is the problem apparently behind the previous "haunted house level shit" fixes and
reversions. This thing does automatically load these modules on the fly. Would be nice
if the unit tests had some comments in them.
o. There were two calls to get_port() right next to
each other, in the very same ? :, and one of them had a ->[0]
tacked on the end and the other one didn't. Well guess what...
the one without was returning an arrayref, which caused these
failures in the unit tests:
Can't call method "get_binding" on unblessed reference at /home/scott/projects/SOAP-WSDL/blib/lib/SOAP/WSDL.pm line 186.
o. protip: reverse %hash with '#default' => 'urn:myNamespace', 'tns' =>
'urn:myNamespace' results in misery. random hash ordering made a pile of
tests in t/003_wsdl_based_serializer.t randomly pass and fail in unison.
o. "vectors" (totally not the same thing as a vector in other languages or on a Cray 1)
have been deprecated and removed. pretend like they never existed.
o. fix two instances of the "Can't modify non-lvalue subroutine call at lib/SOAP/WSDL.pm line 167." error.
it looks like the author wrote
return $a ? $b : $c = $d
Intending it to mean:
return $a ? $b : ($c = $d);
... but perl parses it as:
return ( $a ? $b : $c) = $d;
... and perl 5.16 is more astute about lvalue errors like that.
Release notes for SOAP::WSDL 2.00.10
------- -------
I'm proud to present a new release of SOAP::WSDL. I'm proud to present a new release of SOAP::WSDL.
@@ -20,6 +82,7 @@ Features:
* 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
* Examples in Perl and Java
* Thorough test suite * Thorough test suite
o SOAP::WSDL is heavily regression tested, with a test coverage of o SOAP::WSDL is heavily regression tested, with a test coverage of
over 95% (excluding documentation - you wouldn't want to read over 95% (excluding documentation - you wouldn't want to read
@@ -27,7 +90,7 @@ Features:
* 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 migration 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 SOAP Message 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
@@ -36,6 +99,190 @@ Features:
The following changes have been made: The following changes have been made:
2.00.10 - May 15 2009
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/).
* #44546: XML Schema types with names cuase errors when including anonymous types
SOAP::WSDL now handles element names with "." correctly
* #45037 ComplexTypes' elements in different namespaces not serialized
correctly
SOAP::WSDL now serializes elements in different namespaces correctly
* #43769 Fault11 serialization issue when passed Element for detail
The detail fault element is now automatically wrapped into an appropriate
detail object and serialized correctly.
Note that passing a list as details content is not supported yet.
* #43674 Fault not caught/propagated in SOAP::WSDL::Client::call
Deserializer faults in SOAP::WSDL::Client now propagate correctly to the
caller.
The following uncategorized improvements have been made:
* improved Java example: Commented test class
* improved documentation: Added Cookbook entry for HTTP Negotiate Authentication
(Kerberos).
2.00.09 - Feb 22 2009
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/).
* [ 2631555 ] Template used without version
* [ 2631220 ] Faults generated with soap:Server actor
2.00.08 - Feb 22 2009
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/).
* [2628386] SOAP::WSDL::Generator::Visitor::Typelib still used in tests
* #41453: Content-Type 'charset=...' not set in HTTP header
Already fixed in 2.00.07
2.00.07 - Feb 21 2009
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 2621474 ] Add Non-Perl examples / test client / Servers
The distribution now includes a Java / Apache CXF example.
* [ 2585274 ] Create a HTTP::Server::Simple based SOAP Server
SOAP::WSDL now ships with a server class to use with HTTP::Server::Simple
for testing purposes. See SOAP::WSDL::Server::Simple for details.
* [ 1911232 ] Allow skipping unknown XML elements
See SOAP::WSDL::Manual::Cookbook on how to use this feature
* [ 2505421 ] include XML attributes in as_hash_ref
ComplexTypes now include XML attributes in as_hash_ref's result under the
special key "xmlattr".
As a side effect, as_hash ref now works for ComplexType objects with a
simpleContent content model, too (though the results may be misleading:
Their value is included under the hash key "value", the only other
possible hash key is "xmlattr").
* [ 1960062 ] Use POSIX::strftime for date conversion
Not really a feature, but a little speedup. The Feature request is
obsoleted by resorting to good old sprintf for date formatting.
Speeds up set_value in date and dateTime Objects by around 30% for non-
XML-formatted strings.
As a side effect, dateTime now does not allow setting 0 as date.
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/).
* [ 2621471 ] SOAP::WSDL::Server sends fault with invalid namespace prefix
Faults now use the correct prefix.
* [ 2560208 ] elementFormDefault always "qualified"
SOAP::WSDL now respects the elementFormDefault attribute in embedded
XML Schemas.
* #42049: [PATCH] SOAP::WSDL uses default User-Agent
SOAP::WSDL now announces itself as "SOAP::WSDL $VERSION" instead of
"libwww/perl $VERSION" in HTTP requests. Note however, that this only
applies for wsdl2perl, SOAP::WSDL and SOAP::WSDL::Transport::HTTP.
SOAP::Transport HTTP (from the SOAP-Lite distribution) is not affected.
* [ 2533903 ] Imported schema overwrites existing XML namespace/prefix map
Importing a schema which defined the same XML namespace prefix as the
importing schema, but with a different URI resulted in having the URI
of the associated with the prefix from the imported schema set in the
importing schema.
* #42388 [PATCH] Disabling 'die' in Typemaps
Duplicate of [1911232] Allow skipping unknown XML elements - see added
features.
* #42179 Problem deserializing SOAP messages that contain only a simpleType
Now the top-level element may consist of a simpleType only, too.
The following uncategorized improvements have been made:
* Fixed a =back error in element POD generation
* Improved test suite
* Improved documentation
* Improved TEST_COVERAGE to report coverage correctly
2.00.06 - Dec 03 2008
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/).
* #40658 wsdl2perl - prefix option
The prefix option is now changed to behave more practical
* #40802 wsdl2perl problems with special url
The "fixed" attribute caused an error.
* #40650 Deserialization on inherited types
The inherited complexType variety (sequence/all/choice...) did not get
propagated to derived complexTypes. Thus, derived complexTypes which did
not add elements lost all inherited elements.
* #40108 Test failure on Cygwin
Fixes a test failure on Cygwin due to a malformed file:// URL
* #40021 charset: utf-8
Removed duplicate charset in HTTP requests issued by
SOAP::WSDL::Transport::HTTP. Replaced the utf8 by utf-8 in HTTP requests
* #39715 Error with complexType extension base without child elements
A rather subtle error caused by a wrong init value (undef) for the list
of child elements in a complexType sequence.
* [ 2005693 ] <maxLength fixed ="true"> causes error
* [ 2023797 ] type extensions not handled correctly
ComplexType objects now test their elements with ->isa, not with ref
* [ 2021755 ] Generating nested complexType extensions throws errors
2.00.05 - Jul 13 2008
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/).
* [ 2014482 ] Big-O memory hole when parsing WSDL
SOAP::WSDL still leaks memory when using SOAP::Lite's transport backend
This is to be fixed in 0.710.08 in SOAP::Lite
* #36865 wsdl2perl.pl fails on Expat error
Resolved by dropping a note for Solaris in README
* [ 2005693 ] <maxLength fixed ="true"> causes error
The >fixed< attribute is now recognized (but has no effect yet)
The following uncategorized improvements have been made:
* added missing Class::Std::Storable::Fast import flags to
SOAP::WSDL::XSD::Typelib::Builtin::IDREFS
* some code cleanup
2.00.04
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/).
* [ 1972059 ] Can't set timeout via SOAP::WSDL
* [ 1961409 ] Error with unqualified references in imported schema
* #35873: SOAP::WSDL -- Can't locate object method "set_Action" via package "SOAP::WSDL::OpMessage"
* [ 1969427 ] Mod_Perl.t broken when mod_perl is unavailable
* #35610 Test fails when Test::Without::Module is installed
The following uncategorized improvements have been made:
* Changed the environment variable for author tests to "RELEASE_TESTING",
as defined by the Oslo QA Hackathon 2008
(see http://perl-qa.hexten.net/wiki/index.php/Oslo_QA_Hackathon_2008_:Achievements)
* Enhanced documentation
* Fixed a wrong error message
* Cleaned up test suite (removed duplicate tests)
2.00.03 - May 18 2008 2.00.03 - May 18 2008
The following bugs have been fixed (the numbers in square brackets are the The following bugs have been fixed (the numbers in square brackets are the
@@ -56,6 +303,7 @@ The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/). The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1963613 ] ComplexTypes die on ->can('FOOBAR');
* [ 1943667 ] Error parsing complexType/extension * [ 1943667 ] Error parsing complexType/extension
* [ 1960650 ] multi-level inheritance of complexTypes fails * [ 1960650 ] multi-level inheritance of complexTypes fails
* [ 1960319 ] ComplexType as_hash_ref returns objects on maximum depth * [ 1960319 ] ComplexType as_hash_ref returns objects on maximum depth

View File

@@ -20,6 +20,16 @@ example/genericbarcode.pl
example/hello.pl example/hello.pl
example/hello_compile.pl example/hello_compile.pl
example/hello_lite.pl example/hello_lite.pl
example/java/cxf/.classpath
example/java/cxf/.settings/org.eclipse.jdt.core.prefs
example/java/cxf/.settings/org.maven.ide.eclipse.prefs
example/java/cxf/11_helloworld.wsdl
example/java/cxf/jax-binding.xml
example/java/cxf/pom.xml
example/java/cxf/README
example/java/cxf/src/main/resources/cxf.xml
example/java/cxf/src/test/java/helloworld/HelloWorldTest.java
example/java/cxf/src/test/resources/test-context.xml
example/lib/MyElements/CountCookies.pm example/lib/MyElements/CountCookies.pm
example/lib/MyElements/CountCookiesResponse.pm example/lib/MyElements/CountCookiesResponse.pm
example/lib/MyElements/GenerateBarCode.pm example/lib/MyElements/GenerateBarCode.pm
@@ -69,6 +79,7 @@ example/lib/MyTypes/test2.pm
example/lib/MyTypes/testExtended.pm example/lib/MyTypes/testExtended.pm
example/person.pl example/person.pl
example/person_compile.pl example/person_compile.pl
example/server/hello_simple.pl
example/visitor/visitor.pl example/visitor/visitor.pl
example/weather.pl example/weather.pl
example/weather_wsdl.pl example/weather_wsdl.pl
@@ -77,6 +88,7 @@ example/wsdl/FortuneCookie.xml
example/wsdl/genericbarcode.xml example/wsdl/genericbarcode.xml
example/wsdl/globalweather.xml example/wsdl/globalweather.xml
example/wsdl/Person.wsdl example/wsdl/Person.wsdl
example/wsdl/person.xml
HACKING HACKING
lib/SOAP/WSDL.pm lib/SOAP/WSDL.pm
lib/SOAP/WSDL/Base.pm lib/SOAP/WSDL/Base.pm
@@ -157,9 +169,9 @@ lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/union.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/Typemap.pm lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
lib/SOAP/WSDL/Manual.pod lib/SOAP/WSDL/Manual.pod
lib/SOAP/WSDL/Manual/CodeFirst.pod
lib/SOAP/WSDL/Manual/Cookbook.pod lib/SOAP/WSDL/Manual/Cookbook.pod
lib/SOAP/WSDL/Manual/Deserializer.pod lib/SOAP/WSDL/Manual/Deserializer.pod
lib/SOAP/WSDL/Manual/FAQ.pod lib/SOAP/WSDL/Manual/FAQ.pod
@@ -178,12 +190,14 @@ lib/SOAP/WSDL/Serializer/XSD.pm
lib/SOAP/WSDL/Server.pm lib/SOAP/WSDL/Server.pm
lib/SOAP/WSDL/Server/CGI.pm lib/SOAP/WSDL/Server/CGI.pm
lib/SOAP/WSDL/Server/Mod_Perl2.pm lib/SOAP/WSDL/Server/Mod_Perl2.pm
lib/SOAP/WSDL/Server/Simple.pm
lib/SOAP/WSDL/Service.pm lib/SOAP/WSDL/Service.pm
lib/SOAP/WSDL/SOAP/Address.pm lib/SOAP/WSDL/SOAP/Address.pm
lib/SOAP/WSDL/SOAP/Body.pm lib/SOAP/WSDL/SOAP/Body.pm
lib/SOAP/WSDL/SOAP/Header.pm lib/SOAP/WSDL/SOAP/Header.pm
lib/SOAP/WSDL/SOAP/HeaderFault.pm lib/SOAP/WSDL/SOAP/HeaderFault.pm
lib/SOAP/WSDL/SOAP/Operation.pm lib/SOAP/WSDL/SOAP/Operation.pm
lib/SOAP/WSDL/SOAP/Typelib/Fault.pm
lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
lib/SOAP/WSDL/Transport/HTTP.pm lib/SOAP/WSDL/Transport/HTTP.pm
lib/SOAP/WSDL/Transport/Loopback.pm lib/SOAP/WSDL/Transport/Loopback.pm
@@ -273,14 +287,13 @@ README
t/002_parse_wsdl.t t/002_parse_wsdl.t
t/003_wsdl_based_serializer.t t/003_wsdl_based_serializer.t
t/006_client.t t/006_client.t
t/007_envelope.t
t/008_client_wsdl_complexType.t t/008_client_wsdl_complexType.t
t/009_data_classes.t t/009_data_classes.t
t/011_simpleType.t t/011_simpleType.t
t/012_element.t t/012_element.t
t/013_complexType.t t/013_complexType.t
t/016_client_object.t t/016_client_object.t
t/020_storable.t t/094_cpan_meta.t
t/095_copying.t t/095_copying.t
t/096_characters.t t/096_characters.t
t/097_kwalitee.t t/097_kwalitee.t
@@ -307,11 +320,6 @@ t/acceptance/wsdl/05_simpleType-restriction.wsdl
t/acceptance/wsdl/05_simpleType-union.wsdl t/acceptance/wsdl/05_simpleType-union.wsdl
t/acceptance/wsdl/10_helloworld.asmx.xml 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/ETest.wsdl
t/acceptance/wsdl/contributed/gasquery.wsdl
t/acceptance/wsdl/contributed/OITest.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
@@ -331,11 +339,16 @@ t/acceptance/wsdl/WSDLParser/import_xsd_cascade.wsdl
t/acceptance/wsdl/WSDLParser/imported.xsd t/acceptance/wsdl/WSDLParser/imported.xsd
t/acceptance/wsdl/WSDLParser/xsd_import_no_location.wsdl t/acceptance/wsdl/WSDLParser/xsd_import_no_location.wsdl
t/acceptance/wsdl/WSDLParser_import_loop.wsdl t/acceptance/wsdl/WSDLParser_import_loop.wsdl
t/CodeFirst/ComplexType.pm
t/CodeFirst/element.pm
t/CodeFirst/sequence.pm
t/CodeFirst/test.pl
t/contributed.wsdl t/contributed.wsdl
t/Expat/03_wsdl.t t/lib/CodeFirst.pm
t/lib/Mod_Perl2Test.pm t/lib/Mod_Perl2Test.pm
t/lib/MyComplexType.pm t/lib/MyComplexType.pm
t/lib/MyElement.pm t/lib/MyElement.pm
t/lib/MySimpleElement.pm
t/lib/MySimpleType.pm t/lib/MySimpleType.pm
t/lib/Test/SOAP/WSDL/Expat/WSDLParser.pm t/lib/Test/SOAP/WSDL/Expat/WSDLParser.pm
t/lib/Test/SOAP/WSDL/Generator/Iterator/WSDL11.pm t/lib/Test/SOAP/WSDL/Generator/Iterator/WSDL11.pm
@@ -362,6 +375,7 @@ 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/Base.t
t/SOAP/WSDL/Client.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/Definitions.t
@@ -375,6 +389,8 @@ 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/Template.t t/SOAP/WSDL/Generator/Template.t
t/SOAP/WSDL/Generator/Template/XSD/Import.t
t/SOAP/WSDL/Generator/Template/XSD/Unqualified.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/XSD.t t/SOAP/WSDL/Generator/XSD.t
@@ -388,6 +404,7 @@ 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/Server/Mod_Perl2.t t/SOAP/WSDL/Server/Mod_Perl2.t
t/SOAP/WSDL/Server/Simple.t
t/SOAP/WSDL/Transport/01_Test.t t/SOAP/WSDL/Transport/01_Test.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
@@ -403,7 +420,6 @@ t/SOAP/WSDL/XSD/Enumeration.t
t/SOAP/WSDL/XSD/Schema.t t/SOAP/WSDL/XSD/Schema.t
t/SOAP/WSDL/XSD/SimpleType.t t/SOAP/WSDL/XSD/SimpleType.t
t/SOAP/WSDL/XSD/Typelib/Attribute.t t/SOAP/WSDL/XSD/Typelib/Attribute.t
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.t t/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.t
@@ -414,8 +430,14 @@ t/SOAP/WSDL/XSD/Typelib/Builtin/date.t
t/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.t t/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.t
t/SOAP/WSDL/XSD/Typelib/Builtin/decimal.t t/SOAP/WSDL/XSD/Typelib/Builtin/decimal.t
t/SOAP/WSDL/XSD/Typelib/Builtin/double.t t/SOAP/WSDL/XSD/Typelib/Builtin/double.t
t/SOAP/WSDL/XSD/Typelib/Builtin/duration.t
t/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.t t/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.t
t/SOAP/WSDL/XSD/Typelib/Builtin/float.t t/SOAP/WSDL/XSD/Typelib/Builtin/float.t
t/SOAP/WSDL/XSD/Typelib/Builtin/gDay.t
t/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.t
t/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.t
t/SOAP/WSDL/XSD/Typelib/Builtin/gYear.t
t/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.t
t/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.t t/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.t
t/SOAP/WSDL/XSD/Typelib/Builtin/ID.t t/SOAP/WSDL/XSD/Typelib/Builtin/ID.t
t/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.t t/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.t
@@ -435,6 +457,7 @@ t/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.t
t/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.t t/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.t
t/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.t t/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.t
t/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.t t/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.t
t/SOAP/WSDL/XSD/Typelib/Builtin/QName.t
t/SOAP/WSDL/XSD/Typelib/Builtin/short.t t/SOAP/WSDL/XSD/Typelib/Builtin/short.t
t/SOAP/WSDL/XSD/Typelib/Builtin/string.t t/SOAP/WSDL/XSD/Typelib/Builtin/string.t
t/SOAP/WSDL/XSD/Typelib/Builtin/time.t t/SOAP/WSDL/XSD/Typelib/Builtin/time.t
@@ -452,4 +475,5 @@ t/SOAP/WSDL_NO_MESSAGE.wsdl
t/SOAP/WSDL_NO_PORTTYPE.wsdl t/SOAP/WSDL_NO_PORTTYPE.wsdl
t/test.wsdl t/test.wsdl
TEST_COVERAGE TEST_COVERAGE
test_html.pl
TODO TODO

373
META.yml
View File

@@ -1,373 +0,0 @@
---
name: SOAP-WSDL
version: 2.00.03
author:
- 'Martin Kutter <martin.kutter@fen-net.de>'
abstract: SOAP with WSDL support
license: artistic
resources:
license: http://opensource.org/licenses/artistic-license.php
requires:
Class::Std::Fast: 0.0.5
Data::Dumper: 0
Date::Format: 0
Date::Parse: 0
File::Basename: 0
File::Path: 0
Getopt::Long: 0
LWP::UserAgent: 0
List::Util: 0
Template: 2.18
Term::ReadKey: 0
URI: 0
XML::Parser::Expat: 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: 2.18
Test::More: 0
XML::Parser::Expat: 0
provides:
SOAP::WSDL:
file: lib/SOAP/WSDL.pm
version: 2.00.03
SOAP::WSDL::Base:
file: lib/SOAP/WSDL/Base.pm
version: 2.00.03
SOAP::WSDL::Binding:
file: lib/SOAP/WSDL/Binding.pm
version: 2.00.03
SOAP::WSDL::Client:
file: lib/SOAP/WSDL/Client.pm
version: 2.00.03
SOAP::WSDL::Client::Base:
file: lib/SOAP/WSDL/Client/Base.pm
version: 2.00.03
SOAP::WSDL::Definitions:
file: lib/SOAP/WSDL/Definitions.pm
version: 2.00.03
SOAP::WSDL::Deserializer::Hash:
file: lib/SOAP/WSDL/Deserializer/Hash.pm
version: 2.00.03
SOAP::WSDL::Deserializer::SOM:
file: lib/SOAP/WSDL/Deserializer/SOM.pm
version: 2.00.03
SOAP::WSDL::Deserializer::XSD:
file: lib/SOAP/WSDL/Deserializer/XSD.pm
version: 2.00.03
SOAP::WSDL::Expat::Base:
file: lib/SOAP/WSDL/Expat/Base.pm
version: 2.00.03
SOAP::WSDL::Expat::Message2Hash:
file: lib/SOAP/WSDL/Expat/Message2Hash.pm
version: 2.00.03
SOAP::WSDL::Expat::MessageParser:
file: lib/SOAP/WSDL/Expat/MessageParser.pm
version: 2.00.03
SOAP::WSDL::Expat::MessageStreamParser:
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
version: 2.00.03
SOAP::WSDL::Expat::WSDLParser:
file: lib/SOAP/WSDL/Expat/WSDLParser.pm
version: 2.00.03
SOAP::WSDL::Factory::Deserializer:
file: lib/SOAP/WSDL/Factory/Deserializer.pm
version: 2.00.03
SOAP::WSDL::Factory::Generator:
file: lib/SOAP/WSDL/Factory/Generator.pm
version: 2.00.03
SOAP::WSDL::Factory::Serializer:
file: lib/SOAP/WSDL/Factory/Serializer.pm
version: 2.00.03
SOAP::WSDL::Factory::Transport:
file: lib/SOAP/WSDL/Factory/Transport.pm
version: 2.00.03
SOAP::WSDL::Generator::Iterator::WSDL11:
file: lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm
version: 2.00.03
SOAP::WSDL::Generator::PrefixResolver:
file: lib/SOAP/WSDL/Generator/PrefixResolver.pm
version: 2.00.03
SOAP::WSDL::Generator::Template:
file: lib/SOAP/WSDL/Generator/Template.pm
version: 2.00.03
SOAP::WSDL::Generator::Template::Plugin::XSD:
file: lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
version: 2.00.03
SOAP::WSDL::Generator::Template::XSD:
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
version: 2.00.03
SOAP::WSDL::Generator::Visitor:
file: lib/SOAP/WSDL/Generator/Visitor.pm
version: 2.00.03
SOAP::WSDL::Generator::Visitor::Typelib:
file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
version: 2.00.03
SOAP::WSDL::Generator::Visitor::Typemap:
file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
version: 2.00.03
SOAP::WSDL::Message:
file: lib/SOAP/WSDL/Message.pm
version: 2.00.03
SOAP::WSDL::OpMessage:
file: lib/SOAP/WSDL/OpMessage.pm
version: 2.00.03
SOAP::WSDL::Operation:
file: lib/SOAP/WSDL/Operation.pm
version: 2.00.03
SOAP::WSDL::Part:
file: lib/SOAP/WSDL/Part.pm
version: 2.00.03
SOAP::WSDL::Port:
file: lib/SOAP/WSDL/Port.pm
version: 2.00.03
SOAP::WSDL::PortType:
file: lib/SOAP/WSDL/PortType.pm
version: 2.00.03
SOAP::WSDL::SOAP::Address:
file: lib/SOAP/WSDL/SOAP/Address.pm
version: 2.00.03
SOAP::WSDL::SOAP::Body:
file: lib/SOAP/WSDL/SOAP/Body.pm
version: 2.00.03
SOAP::WSDL::SOAP::Header:
file: lib/SOAP/WSDL/SOAP/Header.pm
version: 2.00.03
SOAP::WSDL::SOAP::HeaderFault:
file: lib/SOAP/WSDL/SOAP/HeaderFault.pm
version: 2.00.03
SOAP::WSDL::SOAP::Operation:
file: lib/SOAP/WSDL/SOAP/Operation.pm
version: 2.00.03
SOAP::WSDL::SOAP::Typelib::Fault11:
file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
version: 2.00.03
SOAP::WSDL::Serializer::XSD:
file: lib/SOAP/WSDL/Serializer/XSD.pm
version: 2.00.03
SOAP::WSDL::Server:
file: lib/SOAP/WSDL/Server.pm
version: 2.00.03
SOAP::WSDL::Server::CGI:
file: lib/SOAP/WSDL/Server/CGI.pm
version: 2.00.03
SOAP::WSDL::Server::Mod_Perl2:
file: lib/SOAP/WSDL/Server/Mod_Perl2.pm
version: 2.00.03
SOAP::WSDL::Service:
file: lib/SOAP/WSDL/Service.pm
version: 2.00.03
SOAP::WSDL::Transport::HTTP:
file: lib/SOAP/WSDL/Transport/HTTP.pm
version: 2.00.03
SOAP::WSDL::Transport::Loopback:
file: lib/SOAP/WSDL/Transport/Loopback.pm
version: 2.00.03
SOAP::WSDL::Transport::Test:
file: lib/SOAP/WSDL/Transport/Test.pm
version: 2.00.03
SOAP::WSDL::TypeLookup:
file: lib/SOAP/WSDL/TypeLookup.pm
version: 2.00.03
SOAP::WSDL::Types:
file: lib/SOAP/WSDL/Types.pm
version: 2.00.03
SOAP::WSDL::XSD::Annotation:
file: lib/SOAP/WSDL/XSD/Annotation.pm
version: 2.00.03
SOAP::WSDL::XSD::Attribute:
file: lib/SOAP/WSDL/XSD/Attribute.pm
version: 2.00.03
SOAP::WSDL::XSD::AttributeGroup:
file: lib/SOAP/WSDL/XSD/AttributeGroup.pm
version: 2.00.03
SOAP::WSDL::XSD::Builtin:
file: lib/SOAP/WSDL/XSD/Builtin.pm
version: 2.00.03
SOAP::WSDL::XSD::ComplexType:
file: lib/SOAP/WSDL/XSD/ComplexType.pm
version: 2.00.03
SOAP::WSDL::XSD::Element:
file: lib/SOAP/WSDL/XSD/Element.pm
version: 2.00.03
SOAP::WSDL::XSD::Enumeration:
file: lib/SOAP/WSDL/XSD/Enumeration.pm
version: 2.00.03
SOAP::WSDL::XSD::FractionDigits:
file: lib/SOAP/WSDL/XSD/FractionDigits.pm
version: 2.00.03
SOAP::WSDL::XSD::Group:
file: lib/SOAP/WSDL/XSD/Group.pm
version: 2.00.03
SOAP::WSDL::XSD::Length:
file: lib/SOAP/WSDL/XSD/Length.pm
version: 2.00.03
SOAP::WSDL::XSD::MaxExclusive:
file: lib/SOAP/WSDL/XSD/MaxExclusive.pm
version: 2.00.03
SOAP::WSDL::XSD::MaxInclusive:
file: lib/SOAP/WSDL/XSD/MaxInclusive.pm
version: 2.00.03
SOAP::WSDL::XSD::MaxLength:
file: lib/SOAP/WSDL/XSD/MaxLength.pm
version: 2.00.03
SOAP::WSDL::XSD::MinExclusive:
file: lib/SOAP/WSDL/XSD/MinExclusive.pm
version: 2.00.03
SOAP::WSDL::XSD::MinInclusive:
file: lib/SOAP/WSDL/XSD/MinInclusive.pm
version: 2.00.03
SOAP::WSDL::XSD::MinLength:
file: lib/SOAP/WSDL/XSD/MinLength.pm
version: 2.00.03
SOAP::WSDL::XSD::Pattern:
file: lib/SOAP/WSDL/XSD/Pattern.pm
version: 2.00.03
SOAP::WSDL::XSD::Schema:
file: lib/SOAP/WSDL/XSD/Schema.pm
version: 2.00.03
SOAP::WSDL::XSD::Schema::Builtin:
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
version: 2.00.03
SOAP::WSDL::XSD::SimpleType:
file: lib/SOAP/WSDL/XSD/SimpleType.pm
version: 2.00.03
SOAP::WSDL::XSD::TotalDigits:
file: lib/SOAP/WSDL/XSD/TotalDigits.pm
version: 2.00.03
SOAP::WSDL::XSD::Typelib::Attribute:
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
version: 2.00.03
SOAP::WSDL::XSD::Typelib::AttributeSet:
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
version: 2.00.03
SOAP::WSDL::XSD::Typelib::Builtin:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
version: 2.00.03
SOAP::WSDL::XSD::Typelib::Builtin::ENTITY:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
SOAP::WSDL::XSD::Typelib::Builtin::ID:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ID.pm
SOAP::WSDL::XSD::Typelib::Builtin::IDREF:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.pm
SOAP::WSDL::XSD::Typelib::Builtin::IDREFS:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.pm
SOAP::WSDL::XSD::Typelib::Builtin::NCName:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm
SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm
SOAP::WSDL::XSD::Typelib::Builtin::NMTOKENS:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm
SOAP::WSDL::XSD::Typelib::Builtin::NOTATION:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm
SOAP::WSDL::XSD::Typelib::Builtin::Name:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm
SOAP::WSDL::XSD::Typelib::Builtin::QName:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm
SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
SOAP::WSDL::XSD::Typelib::Builtin::anyType:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
version: 2.00.03
SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm
SOAP::WSDL::XSD::Typelib::Builtin::boolean:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm
version: 2.00.03
SOAP::WSDL::XSD::Typelib::Builtin::byte:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm
SOAP::WSDL::XSD::Typelib::Builtin::date:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm
SOAP::WSDL::XSD::Typelib::Builtin::dateTime:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm
SOAP::WSDL::XSD::Typelib::Builtin::decimal:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm
SOAP::WSDL::XSD::Typelib::Builtin::double:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm
SOAP::WSDL::XSD::Typelib::Builtin::duration:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm
SOAP::WSDL::XSD::Typelib::Builtin::float:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm
SOAP::WSDL::XSD::Typelib::Builtin::gDay:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm
SOAP::WSDL::XSD::Typelib::Builtin::gMonth:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm
SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm
SOAP::WSDL::XSD::Typelib::Builtin::gYear:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm
SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm
SOAP::WSDL::XSD::Typelib::Builtin::hexBinary:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm
SOAP::WSDL::XSD::Typelib::Builtin::int:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm
SOAP::WSDL::XSD::Typelib::Builtin::integer:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm
SOAP::WSDL::XSD::Typelib::Builtin::language:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm
SOAP::WSDL::XSD::Typelib::Builtin::list:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm
SOAP::WSDL::XSD::Typelib::Builtin::long:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm
SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm
SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm
SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm
SOAP::WSDL::XSD::Typelib::Builtin::normalizedString:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm
SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm
SOAP::WSDL::XSD::Typelib::Builtin::short:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm
SOAP::WSDL::XSD::Typelib::Builtin::string:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm
SOAP::WSDL::XSD::Typelib::Builtin::time:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm
version: 2.00.03
SOAP::WSDL::XSD::Typelib::Builtin::token:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm
SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm
SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm
SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
SOAP::WSDL::XSD::Typelib::ComplexType:
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
version: 2.1.0
SOAP::WSDL::XSD::Typelib::Element:
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
version: 2.00.03
SOAP::WSDL::XSD::Typelib::SimpleType:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
version: 2.00.03
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
version: 2.00.03
SOAP::WSDL::XSD::WhiteSpace:
file: lib/SOAP/WSDL/XSD/WhiteSpace.pm
version: 2.00.03
generated_by: Module::Build version 0.2808
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.2.html
version: 1.2
no_index:
directory: lib/SOAP/WSDL/Generator/Template/XSD/

View File

@@ -1,6 +1,44 @@
# Note: this file was auto-generated by Module::Build::Compat version 0.03 use 5.010000;
use Module::Build::Compat 0.02; use ExtUtils::MakeMaker;
Module::Build::Compat->run_build_pl(args => \@ARGV); WriteMakefile(
require Module::Build; NAME => 'SOAP::WSDL',
Module::Build::Compat->write_makefile(build_class => 'Module::Build'); VERSION_FROM => 'lib/SOAP/WSDL.pm',
PREREQ_PM => {
'Class::Std::Fast' => q(0.000005),
'Cwd' => 0,
'Data::Dumper' => 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' => q(2.18),
'Term::ReadKey' => 0,
'Test::More' => 0,
'URI' => 0,
'XML::Parser::Expat' => 0,
'Class::Load' => 0.20,
'perl' => q(5.008),
},
test => { RECURSIVE_TEST_FILES => 1, },
ABSTRACT_FROM => 'lib/SOAP/WSDL.pm',
AUTHOR => 'Scott Walters <scott@slowass.net>',
(eval { ExtUtils::MakeMaker->VERSION(6.46) } ? (META_MERGE => {
'meta-spec' => { version => 2 },
resources => {
repository => {
type => 'git',
url => 'https://github.com/scrottie/SOAP-WSDL.git',
web => 'https://github.com/scrottie/SOAP-WSDL',
},
}})
: ()
),
);

11
README
View File

@@ -41,4 +41,13 @@ If you don't have Module::Build installed, you may also use
make install make install
Note that Module::Build is the recommended installer - make will not run Note that Module::Build is the recommended installer - make will not run
all tests provided with SOAP-WSDL. all tests provided with SOAP-WSDL.
SOLARIS INSTALLATION NOTES
--------------------------
According to a CPAN RT report http://rt.cpan.org/Ticket/Display.html?id=36865
it may be necessary to check (and possibly update) the expat libraries
required by XML::Parser.
SOAP::WSDL's metadata includes XML::Parser, but it seems that the expat
libraries XML::Parser depends on may slip through missing or outdated.

View File

@@ -6,12 +6,20 @@
# Note that this shell script requires Devel::CoverX::Covered - if you # Note that this shell script requires Devel::CoverX::Covered - if you
# don't have it, comment out the line noted below # don't have it, comment out the line noted below
# #
cd t/ perl Build.PL && perl Build && \
cover -delete perl -MTAP::Harness -MFile::Find::Rule -e '
find . -type f -name '*.t' | xargs -n 1 /usr/bin/perl -MDevel::Cover=-silent,1,-summary,0 -I../lib > /dev/null local $ENV{TEST_VERBOSE} = 1;
TAP::Harness->new({
merge => 1,
lib => [ q{t/lib}, q{blib/lib} ],
switches => [ q{-MDevel::Cover=-ignore,.,-select,^blib/lib/.+,-coverage,statement,-coverage,subroutine,-coverage,condition,-coverage,branch} ],
})->runtests( sort { $a cmp $b } File::Find::Rule->file()->name( q{*.t} )->in( q{t/} ) );
'
# Devel::CoverX::Covered # Devel::CoverX::Covered
covered runs # covered runs
cover -ignore_re \.t$ -ignore_re ^lib -coverage="statement" -coverage=condition -coverage=subroutine -coverage="branch" cover
# cover -coverage="statement" -coverage=condition -coverage=subroutine -coverage="branch"

View File

@@ -1,9 +1,20 @@
use Benchmark qw(cmpthese); use Benchmark qw(cmpthese timethis timethese);
use POSIX (); use POSIX ();
use Date::Format (); use Date::Format ();
my @time_from = localtime; my @time_from = localtime;
#use lib '../../lib';
use SOAP::WSDL::XSD::Typelib::Builtin::dateTime;
my $date = SOAP::WSDL::XSD::Typelib::Builtin::dateTime->new();
timethese 10000, {
'sprintf' => sub { $date->set_value('Dec 24 2004 CET'); }
};
__END__
print "Comparing POSIX::strftime and Date::Format::strftime '%Y-%m-%dT%H:%M:%S%z'\n\n"; print "Comparing POSIX::strftime and Date::Format::strftime '%Y-%m-%dT%H:%M:%S%z'\n\n";
print 'POSIX: ', POSIX::strftime('%Y-%m-%dT%H:%M:%S%z', @time_from), "\n"; print 'POSIX: ', POSIX::strftime('%Y-%m-%dT%H:%M:%S%z', @time_from), "\n";
print 'Date::Format: ', Date::Format::strftime('%Y-%m-%dT%H:%M:%S%z', @time_from), "\n"; print 'Date::Format: ', Date::Format::strftime('%Y-%m-%dT%H:%M:%S%z', @time_from), "\n";

View File

@@ -8,18 +8,19 @@ use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/lib';
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/arch'; use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/arch';
use Data::Dumper; use Data::Dumper;
use SOAP::Lite; use SOAP::Lite;
use XML::Compile::SOAP11;
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 timethese); use Benchmark qw(cmpthese timethese);
use SOAP::WSDL::Transport::HTTP; use SOAP::WSDL::Transport::HTTP;
use SOAP::WSDL::Factory::Transport; use SOAP::WSDL::Factory::Transport;
SOAP::WSDL::Factory::Transport->register('http', 'SOAP::WSDL::Transport::HTTP'); 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.pl';
my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld'; #my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld';
my $lite = SOAP::Lite->new( my $lite = SOAP::Lite->new(
proxy => $proxy proxy => $proxy
@@ -35,7 +36,7 @@ my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new({
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new({ my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new({
proxy => $proxy, 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 = ();;
@@ -81,11 +82,11 @@ sub lite_bench {
compile_bench(); compile_bench();
lite_bench(); lite_bench();
wsdl_bench(); wsdl_bench();
wsdl_xs_bench(); #wsdl_xs_bench();
timethese 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,
}; };

View File

@@ -8,6 +8,7 @@ use strict;
use Benchmark qw(cmpthese); use Benchmark qw(cmpthese);
use XML::Compile::SOAP11;
use XML::Compile::Transport::SOAPHTTP(); use XML::Compile::Transport::SOAPHTTP();
use XML::Compile::Util; use XML::Compile::Util;
use XML::Compile::WSDL11; use XML::Compile::WSDL11;
@@ -16,7 +17,7 @@ use XML::Simple;
use SOAP::Lite; use SOAP::Lite;
use MyInterfaces::TestService::TestPort; use MyInterfaces::TestService::TestPort;
use SOAP::WSDL::Deserializer::XSD_XS; #use SOAP::WSDL::Deserializer::XSD_XS;
use SOAP::WSDL::Factory::Deserializer; use SOAP::WSDL::Factory::Deserializer;
# #
@@ -82,17 +83,17 @@ my $person = {
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl', my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl',
sloppy_integers => 1, sloppy_integers => 1,
check_values => 0, check_values => 0,
check_values => 0,
validation => 0, validation => 0,
ignore_facets => 1, ignore_facets => 1,
); );
#
# Call all variants once to allow their first-time tasks to be done
#
my $call = $compile->compileClient('ListPerson'); my $call = $compile->compileClient('ListPerson');
$call->({ in => undef}); $call->({ in => undef});
# Initialize SOAP::Lite
my $deserializer = SOAP::Deserializer->new();
# Initialize SOAP::WSDL interface # Initialize SOAP::WSDL interface
my $soap = MyInterfaces::TestService::TestPort->new(); my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too # Load all classes - XML::Compile has created everything before, too
@@ -102,9 +103,18 @@ my $lite = SOAP::Lite->new()->default_ns('http://www.example.org/benchmark/')
->proxy('http://localhost:81/soap-wsdl-test/person.pl'); ->proxy('http://localhost:81/soap-wsdl-test/person.pl');
$lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } ); $lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
$lite->ListPerson();
my $lite_xml = SOAP::Lite->new()->default_ns('http://www.example.org/benchmark/')
->proxy('http://localhost:81/soap-wsdl-test/person.pl');
$lite_xml->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
$lite_xml->outputxml(1);
$lite_xml->ListPerson();
# # register for SOAP 1.1 # # register for SOAP 1.1
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' ); #SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
my $wsdl_xs = MyInterfaces::TestService::TestPort->new(); #my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
my $count = 70; my $count = 70;
my @data = (); my @data = ();
@@ -114,42 +124,52 @@ SOAP::Lite - $SOAP::Lite::VERSION
SOAP::WSDL - $SOAP::WSDL::Client::VERSION SOAP::WSDL - $SOAP::WSDL::Client::VERSION
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION; SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
XML::Simple - $XML::Simple::VERSION
XML::Simple uses XML::Parser as backend and SOAP::Lite with
outputxml(1) set as SOAP client.
XML::Parser - $XML::Parser::VERSION
XML::Simple is not benchmarked in run 3ff, as it is expected
do deliver the same result.
Benchmark $n: Store result in private variable and destroy it Benchmark $n: Store result in private variable and destroy it
"; ";
$n++; $n++;
cmpthese $count, { 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') }, 'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
# 'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
'XML::Compile' => sub { my $result = $call->() },
'XML::Simple' => sub { my $result = XMLin( $lite_xml->call('ListPerson')) },
}; };
print "\nBenchmark $n: Push result on list\n"; print "\nBenchmark $n: Push result on list\n";
$n++; $n++;
cmpthese $count, { 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') }, 'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
# 'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'XML::Compile' => sub { push @data, $call->() },
'XML::Simple' => sub { push @data, XMLin( $lite_xml->call('ListPerson')) },
}; };
@data = (); @data = ();
print "\nBenchmark $n: Play it again, Sam\n"; print "\nBenchmark $n: Play it, please play it again, Sam\n";
$n++; $n++;
cmpthese $count, { cmpthese $count, {
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) }, 'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) }, # 'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'XML::Compile' => sub { push @data, $call->() }, # 'XML::Compile' => sub { push @data, $call->() },
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') }, # 'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
}; };
print "\nBenchmark $n: ca. 1kB request - result destroyed immediately\n"; print "\nBenchmark $n: ca. 1kB request - result destroyed immediately\n";
$n++; $n++;
cmpthese $count, { cmpthese $count, {
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({ in => $person }) }, 'SOAP::WSDL' => sub { my $result = $soap->ListPerson({ in => $person }) },
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({ in => $person }) }, # 'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({ in => $person }) },
'XML::Compile' => sub { my $result = $call->({ in => $person }) }, 'XML::Compile' => sub { my $result = $call->({ in => $person }) },
}; };
@@ -157,7 +177,7 @@ print "\nBenchmark $n: ca. 1kB request - push result on list\n";
$n++; $n++;
cmpthese $count, { cmpthese $count, {
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({ in => $person }) }, 'SOAP::WSDL' => sub { push @data, $soap->ListPerson({ in => $person }) },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({ in => $person }) }, # 'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({ in => $person }) },
'XML::Compile' => sub { push @data, $call->({ in => $person }) }, 'XML::Compile' => sub { push @data, $call->({ in => $person }) },
}; };

View File

@@ -5,7 +5,7 @@ use lib '../../SOAP-WSDL_XS/blib/arch';
use strict; use strict;
use Benchmark; use Benchmark;
use Storable; use Storable;
#use SOAP::WSDL::Deserializer::XSD_XS; use SOAP::WSDL::Deserializer::XSD_XS;
use SOAP::WSDL::Factory::Deserializer; use SOAP::WSDL::Factory::Deserializer;
# # register for SOAP 1.1 # # register for SOAP 1.1
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' ); SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
@@ -16,10 +16,10 @@ my @data = ();
my $soap = MyInterfaces::TestService::TestPort->new(); my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too # Load all classes - XML::Compile has created everything before, too
#timethis 100, sub { $soap->ListPerson({}) }; timethis 150, sub { $soap->ListPerson({}) };
#timethis 50, sub { push @data, $soap->ListPerson({}) }; timethis 300, sub { push @data, $soap->ListPerson({}) };
#@data = (); @data = ();
# timethis 50, sub { push @data, $soap->ListPerson({}) }; timethis 300, sub { push @data, $soap->ListPerson({}) };
# for (1..50) { push @data, $soap->ListPerson({}) }; # for (1..50) { push @data, $soap->ListPerson({}) };
#print $soap->ListPerson({}); #print $soap->ListPerson({});

View File

@@ -10,13 +10,13 @@ use Term::ReadKey;
my %opt = ( my %opt = (
url => '', url => '',
prefix => undef, prefix => 'My',
attribute_prefix => 'MyAttributes', attribute_prefix => undef,
type_prefix => 'MyTypes', type_prefix => undef,
element_prefix => 'MyElements', element_prefix => undef,
typemap_prefix => 'MyTypemaps', typemap_prefix => undef,
interface_prefix => 'MyInterfaces', interface_prefix => undef,
server_prefix => 'MyServer', server_prefix => undef,
base_path => 'lib/', base_path => 'lib/',
proxy => undef, proxy => undef,
generator => 'XSD', generator => 'XSD',
@@ -86,11 +86,26 @@ 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.
$lwp->agent(qq[SOAP::WSDL $SOAP::WSDL::Expat::WSDLParser::VERSION]);
my $parser = SOAP::WSDL::Expat::WSDLParser->new({ my $parser = SOAP::WSDL::Expat::WSDLParser->new({
user_agent => $lwp, user_agent => $lwp,
}); });
# resolve the default prefix options
map {
my $opt_key = $_;
if ( $opt_key =~ / (\w+) _prefix $/xms # relevant option
&& !$opt{ $opt_key } # that hasn't already been explicitly set
)
{
my $prefix_type = $1;
$opt{ $opt_key } = $opt{prefix} . # My
ucfirst( $prefix_type ) . # Typemap
( $prefix_type eq 'server' ? '' : 's' ); # s
}
} keys %opt;
my $definitions = $parser->parse_uri( $url ); my $definitions = $parser->parse_uri( $url );
my %typemap = (); my %typemap = ();
@@ -150,7 +165,9 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
NAME SHORT DESCRITPION NAME SHORT DESCRITPION
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
prefix p Prefix for both type and element classes. prefix p Prefix for all generated classes. If you set "-p=Foo",
you will get "FooAttributes", "FooTypes",
"FooElements" and so on.
attribute_prefix a Prefix for XML attribute classes. attribute_prefix a Prefix for XML attribute classes.
Default: MyAttributes Default: MyAttributes
type_prefix t Prefix for type classes. type_prefix t Prefix for type classes.

View File

@@ -7,7 +7,9 @@ use lib 'lib'; # just needed because interface lies here
use MyInterfaces::HelloWorld::HelloWorldSoap; use MyInterfaces::HelloWorld::HelloWorldSoap;
# I instantiate a interface class. # I instantiate a interface class.
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new(); my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new({
# proxy => 'http://localhost:8080/JLearn/WS/sayHello'
});
# 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
my $result = $soap->sayHello({ my $result = $soap->sayHello({

View File

@@ -1,18 +1,21 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
use strict; use strict;
use warnings; use warnings;
use XML::Compile::SOAP11;
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 # I need access to the WSDL around - or use Data::Dumper::Streamer
# for serializing the generated closures into (big) perl files # 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 compile a interface method for a single SOAP method 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 # I have to lookup the method names from the WSDL
# or use the provided script examining the WSDL
my $call = $wsdl->compileClient('sayHello'); my $call = $wsdl->compileClient('sayHello');
# I have to lookup the parameters from the WSDL - can be quite tricky # I have to lookup the parameters from the WSDL - can be quite tricky
# XML::Compile provides a script creating examples, so I can use that, too.
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"',
@@ -22,4 +25,5 @@ my $result = $call->(
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 Data::Dumper # I have to lookup the output parameters from the WSDL - or try Data::Dumper
# XML::Compile provides a script creating examples, so I can use that, too.
print $result->{ parameters }->{ sayHelloResult }, "\n"; print $result->{ parameters }->{ sayHelloResult }, "\n";

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 +trace; 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(

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src/test/java"/>
<classpathentry kind="src" path="src/main/java"/>
<classpathentry kind="src" path="src/main/resources"/>
<classpathentry kind="src" path="src/test/resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/java-6-openjdk"/>
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View File

@@ -0,0 +1,5 @@
#Fri Feb 20 19:27:55 CET 2009
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.source=1.5

View File

@@ -0,0 +1,8 @@
#Fri Feb 20 19:27:52 CET 2009
activeProfiles=
eclipse.preferences.version=1
fullBuildGoals=process-test-resources
includeModules=false
resolveWorkspaceProjects=true
resourceFilterGoals=process-resources resources\:testResources
version=1

View File

@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="urn:HelloWorld"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
targetNamespace="urn:HelloWorld"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<s:schema elementFormDefault="qualified"
targetNamespace="urn:HelloWorld">
<s:element name="sayHello">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1"
name="givenName" type="s:string" nillable="1" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="sayHelloResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="sayHelloResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="test2">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name"
type="s:string" />
<s:element minOccurs="0" maxOccurs="1"
name="givenName" type="s:string" />
</s:sequence>
</s:complexType>
<s:complexType name="testExtended">
<s:extension base="s0:test2">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="extend" type="s:string" />
</s:sequence>
</s:extension>
</s:complexType>
</s:schema>
</types>
<message name="sayHelloSoapIn">
<part name="parameters" element="s0:sayHello" />
</message>
<message name="sayHelloSoapOut">
<part name="parameters" element="s0:sayHelloResponse" />
</message>
<portType name="Service1Soap">
<operation name="sayHello">
<input message="s0:sayHelloSoapIn" />
<output message="s0:sayHelloSoapOut" />
</operation>
</portType>
<binding name="Service1Soap" type="s0:Service1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<operation name="sayHello">
<soap:operation soapAction="urn:HelloWorld#sayHello"
style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<service name="HelloWorld">
<port name="HelloWorldSoap" binding="s0:Service1Soap">
<soap:address
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
</port>
</service>
</definitions>

22
example/java/cxf/README Normal file
View File

@@ -0,0 +1,22 @@
README
------
This is an example for creating a Apache CXF based client for a SOAP::WSDL
based SOAP server.
The example contains a pom.xml for building CXF based SOAP Clients from
a WSDL, a test Spring context configuration, and a JUnit4 test class for
testing the generated client.
It is intended to run against the HTTP::Server::Simple based SOAP server
in example/server/hello_simple.pl
To run the example, fire up the test server by calling
perl example/server/hello_simple.pl
Then open a second terminal and run
mvn test
The included JUnit test should pass.

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<bindings
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://java.sun.com/xml/ns/jaxws"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
>
<bindings
node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='urn:HelloWorld']">
<jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<jxb:serializable/>
</jxb:globalBindings>
</bindings>
</bindings>

181
example/java/cxf/pom.xml Normal file
View File

@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>perl.soap.wsdl</groupId>
<artifactId>cxf-test</artifactId>
<version>1.0.0</version>
<properties>
<cxf.version>2.1.4</cxf.version>
</properties>
<dependencies>
<!--
Depending on your requirements you may need more or fewer modules
from cxf
--><!--
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-api</artifactId>
<version>${cxf.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-common-utilities</artifactId>
<version>${cxf.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.core</artifactId>
<version>2.5.6.A</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.beans</artifactId>
<version>2.5.6.A</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.test</artifactId>
<version>2.5.6.A</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.context</artifactId>
<version>2.5.6.A</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.web</artifactId>
<version>2.5.6.A</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.0.9</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${basedir}/src/main/java</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/11_helloworld.wsdl</wsdl>
<extraargs>
<extraarg>-b</extraarg>
<extraarg>${basedir}/jax-binding.xml</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,21 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
xsi:schemaLocation="http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
This http-conf:conduit is required for SOAP::WSDL based CGI-servers.
SOAP::WSDL::Server::CGI does not allow chunked transfer-encoding, which
is the default for CXF. the http-conf:conduit below switches it off.
Adapt the name to your URI(s). Wildcards are allowed.
-->
<http-conf:conduit
name="http://localhost:8081.http-conduit">
<http-conf:client AllowChunking="false"/>
</http-conf:conduit>
</beans>

View File

@@ -0,0 +1,38 @@
package helloworld;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
// Spring JUnit Test runner
@RunWith(SpringJUnit4ClassRunner.class)
// load spring context from here
@ContextConfiguration(locations = { "classpath:test-context.xml"})
/** Test class for the HelloWorld service
*
* It's more of a integration test, not a Unit test (though using
* JUnit4).
*
* Fire up the SOAP server in example/server/hello_simple.pl before
* running - the test will fail if it can't find the appropriate SOAP server
* at http://localhost:8081/
*
*/
public class HelloWorldTest {
// soapClient bean automatically provided by spring
@Autowired
private Service1Soap soapClient;
@Test
public void testClient() {
assertNotNull(soapClient);
String result = soapClient.sayHello("Kutter", "Martin");
assertEquals("Hello Martin Kutter", result);
}
}

View File

@@ -0,0 +1,16 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<bean id="proxyFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="helloworld.Service1Soap"/>
<property name="address" value="http://localhost:8081"/>
</bean>
<bean id="helloWorldClient" class="helloworld.Service1Soap"
factory-bean="proxyFactory" factory-method="create"/>
</beans>

View File

@@ -1,3 +1,4 @@
package MyElements::CountCookies; package MyElements::CountCookies;
use strict; use strict;
use warnings; use warnings;
@@ -17,13 +18,30 @@ use base qw(
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
our $XML_ATTRIBUTE_CLASS;
undef $XML_ATTRIBUTE_CLASS;
sub __get_attr_class {
return $XML_ATTRIBUTE_CLASS;
}
# There's no variety - empty complexType
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
__PACKAGE__->_factory();
} # end of BLOCK } # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -36,6 +54,21 @@ MyElements::CountCookies
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
CountCookies from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. CountCookies from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
=over
=head1 METHODS =head1 METHODS
=head2 new =head2 new

View File

@@ -1,3 +1,4 @@
package MyElements::CountCookiesResponse; package MyElements::CountCookiesResponse;
use strict; use strict;
use warnings; use warnings;
@@ -16,6 +17,14 @@ use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
our $XML_ATTRIBUTE_CLASS;
undef $XML_ATTRIBUTE_CLASS;
sub __get_attr_class {
return $XML_ATTRIBUTE_CLASS;
}
use Class::Std::Fast::Storable constructor => 'none'; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
@@ -26,14 +35,18 @@ Class::Std::initialize();
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>); my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
__PACKAGE__->_factory( __PACKAGE__->_factory(
[ qw( [ qw( CountCookiesResult
CountCookiesResult
) ], ) ],
{ {
CountCookiesResult => \%CountCookiesResult_of, 'CountCookiesResult' => \%CountCookiesResult_of,
}, },
{ {
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'CountCookiesResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
},
{
'CountCookiesResult' => 'CountCookiesResult',
} }
); );
@@ -44,11 +57,12 @@ __PACKAGE__->_factory(
} # end of BLOCK } # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -61,6 +75,30 @@ MyElements::CountCookiesResponse
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
CountCookiesResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. CountCookiesResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
=over
=item * CountCookiesResult
$element->set_CountCookiesResult($data);
$element->get_CountCookiesResult();
=back
=head1 METHODS =head1 METHODS
=head2 new =head2 new

View File

@@ -43,12 +43,6 @@ __PACKAGE__->_factory(
} # end BLOCK } # end BLOCK
} # end of BLOCK } # end of BLOCK
1; 1;

View File

@@ -1,3 +1,4 @@
package MyElements::GetFortuneCookie; package MyElements::GetFortuneCookie;
use strict; use strict;
use warnings; use warnings;
@@ -17,13 +18,30 @@ use base qw(
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
our $XML_ATTRIBUTE_CLASS;
undef $XML_ATTRIBUTE_CLASS;
sub __get_attr_class {
return $XML_ATTRIBUTE_CLASS;
}
# There's no variety - empty complexType
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
__PACKAGE__->_factory();
} # end of BLOCK } # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -36,6 +54,21 @@ MyElements::GetFortuneCookie
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
GetFortuneCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. GetFortuneCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
=over
=head1 METHODS =head1 METHODS
=head2 new =head2 new

View File

@@ -1,3 +1,4 @@
package MyElements::GetFortuneCookieResponse; package MyElements::GetFortuneCookieResponse;
use strict; use strict;
use warnings; use warnings;
@@ -16,6 +17,14 @@ use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
our $XML_ATTRIBUTE_CLASS;
undef $XML_ATTRIBUTE_CLASS;
sub __get_attr_class {
return $XML_ATTRIBUTE_CLASS;
}
use Class::Std::Fast::Storable constructor => 'none'; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
@@ -26,14 +35,18 @@ Class::Std::initialize();
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>); my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
__PACKAGE__->_factory( __PACKAGE__->_factory(
[ qw( [ qw( GetFortuneCookieResult
GetFortuneCookieResult
) ], ) ],
{ {
GetFortuneCookieResult => \%GetFortuneCookieResult_of, 'GetFortuneCookieResult' => \%GetFortuneCookieResult_of,
}, },
{ {
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetFortuneCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
},
{
'GetFortuneCookieResult' => 'GetFortuneCookieResult',
} }
); );
@@ -44,11 +57,12 @@ __PACKAGE__->_factory(
} # end of BLOCK } # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -61,6 +75,30 @@ MyElements::GetFortuneCookieResponse
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
GetFortuneCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. GetFortuneCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
=over
=item * GetFortuneCookieResult
$element->set_GetFortuneCookieResult($data);
$element->get_GetFortuneCookieResult();
=back
=head1 METHODS =head1 METHODS
=head2 new =head2 new

View File

@@ -1,3 +1,4 @@
package MyElements::GetSpecificCookie; package MyElements::GetSpecificCookie;
use strict; use strict;
use warnings; use warnings;
@@ -16,6 +17,14 @@ use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
our $XML_ATTRIBUTE_CLASS;
undef $XML_ATTRIBUTE_CLASS;
sub __get_attr_class {
return $XML_ATTRIBUTE_CLASS;
}
use Class::Std::Fast::Storable constructor => 'none'; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
@@ -26,14 +35,18 @@ Class::Std::initialize();
my %index_of :ATTR(:get<index>); my %index_of :ATTR(:get<index>);
__PACKAGE__->_factory( __PACKAGE__->_factory(
[ qw( [ qw( index
index
) ], ) ],
{ {
index => \%index_of, 'index' => \%index_of,
}, },
{ {
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
},
{
'index' => 'index',
} }
); );
@@ -44,11 +57,12 @@ __PACKAGE__->_factory(
} # end of BLOCK } # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -61,6 +75,30 @@ MyElements::GetSpecificCookie
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
GetSpecificCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. GetSpecificCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
=over
=item * index
$element->set_index($data);
$element->get_index();
=back
=head1 METHODS =head1 METHODS
=head2 new =head2 new

View File

@@ -1,3 +1,4 @@
package MyElements::GetSpecificCookieResponse; package MyElements::GetSpecificCookieResponse;
use strict; use strict;
use warnings; use warnings;
@@ -16,6 +17,14 @@ use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
our $XML_ATTRIBUTE_CLASS;
undef $XML_ATTRIBUTE_CLASS;
sub __get_attr_class {
return $XML_ATTRIBUTE_CLASS;
}
use Class::Std::Fast::Storable constructor => 'none'; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
@@ -26,14 +35,18 @@ Class::Std::initialize();
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>); my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
__PACKAGE__->_factory( __PACKAGE__->_factory(
[ qw( [ qw( GetSpecificCookieResult
GetSpecificCookieResult
) ], ) ],
{ {
GetSpecificCookieResult => \%GetSpecificCookieResult_of, 'GetSpecificCookieResult' => \%GetSpecificCookieResult_of,
}, },
{ {
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetSpecificCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
},
{
'GetSpecificCookieResult' => 'GetSpecificCookieResult',
} }
); );
@@ -44,11 +57,12 @@ __PACKAGE__->_factory(
} # end of BLOCK } # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -61,6 +75,30 @@ MyElements::GetSpecificCookieResponse
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
GetSpecificCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. GetSpecificCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
=over
=item * GetSpecificCookieResult
$element->set_GetSpecificCookieResult($data);
$element->get_GetSpecificCookieResult();
=back
=head1 METHODS =head1 METHODS
=head2 new =head2 new

View File

@@ -1,3 +1,4 @@
package MyElements::int; package MyElements::int;
use strict; use strict;
use warnings; use warnings;
@@ -14,14 +15,12 @@ __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
); );
}
} # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -34,6 +33,12 @@ MyElements::int
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
int from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. int from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 METHODS =head1 METHODS
=head2 new =head2 new

View File

@@ -1,3 +1,4 @@
package MyElements::readNodeCount; package MyElements::readNodeCount;
use strict; use strict;
use warnings; use warnings;
@@ -17,13 +18,30 @@ use base qw(
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
our $XML_ATTRIBUTE_CLASS;
undef $XML_ATTRIBUTE_CLASS;
sub __get_attr_class {
return $XML_ATTRIBUTE_CLASS;
}
# There's no variety - empty complexType
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
__PACKAGE__->_factory();
} # end of BLOCK } # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -36,6 +54,21 @@ MyElements::readNodeCount
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
readNodeCount from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. readNodeCount from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
=over
=head1 METHODS =head1 METHODS
=head2 new =head2 new

View File

@@ -1,3 +1,4 @@
package MyElements::readNodeCountResponse; package MyElements::readNodeCountResponse;
use strict; use strict;
use warnings; use warnings;
@@ -16,6 +17,14 @@ use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
our $XML_ATTRIBUTE_CLASS;
undef $XML_ATTRIBUTE_CLASS;
sub __get_attr_class {
return $XML_ATTRIBUTE_CLASS;
}
use Class::Std::Fast::Storable constructor => 'none'; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
@@ -26,14 +35,18 @@ Class::Std::initialize();
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>); my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
__PACKAGE__->_factory( __PACKAGE__->_factory(
[ qw( [ qw( readNodeCountResult
readNodeCountResult
) ], ) ],
{ {
readNodeCountResult => \%readNodeCountResult_of, 'readNodeCountResult' => \%readNodeCountResult_of,
}, },
{ {
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'readNodeCountResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
},
{
'readNodeCountResult' => 'readNodeCountResult',
} }
); );
@@ -44,11 +57,12 @@ __PACKAGE__->_factory(
} # end of BLOCK } # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -61,6 +75,30 @@ MyElements::readNodeCountResponse
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
readNodeCountResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. readNodeCountResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
=over
=item * readNodeCountResult
$element->set_readNodeCountResult($data);
$element->get_readNodeCountResult();
=back
=head1 METHODS =head1 METHODS
=head2 new =head2 new

View File

@@ -1,27 +1,26 @@
package MyElements::string; package MyElements::string;
use strict; use strict;
use warnings; use warnings;
{ # BLOCK to scope variables { # BLOCK to scope variables
sub get_xmlns { 'http://www.webserviceX.NET' } sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
__PACKAGE__->__set_name('string'); __PACKAGE__->__set_name('string');
__PACKAGE__->__set_nillable(true); __PACKAGE__->__set_nillable(1);
__PACKAGE__->__set_minOccurs(); __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
); );
}
} # end of BLOCK
1; 1;
# __END__
=pod =pod
@@ -32,7 +31,13 @@ MyElements::string
=head1 DESCRIPTION =head1 DESCRIPTION
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
string from the namespace http://www.webserviceX.NET. string from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 METHODS =head1 METHODS

View File

@@ -13,6 +13,8 @@ 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};
$_[0]->set_class_resolver('MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie') $_[0]->set_class_resolver('MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie')
if not $_[2]->{class_resolver}; if not $_[2]->{class_resolver};
$_[0]->set_prefix($_[2]->{use_prefix}) if exists $_[2]->{use_prefix};
} }
sub readNodeCount { sub readNodeCount {
@@ -24,10 +26,11 @@ sub readNodeCount {
style => 'document', style => 'document',
body => { body => {
'use' => 'literal',
namespace => '', 'use' => 'literal',
encodingStyle => '', namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
parts => [qw( MyElements::readNodeCount )], encodingStyle => '',
parts => [qw( MyElements::readNodeCount )],
}, },
header => { header => {
@@ -38,6 +41,7 @@ sub readNodeCount {
}, $body, $header); }, $body, $header);
} }
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); die "GetFortuneCookie must be called as object method (\$self is <$self>)" if not blessed($self);
@@ -47,10 +51,11 @@ sub GetFortuneCookie {
style => 'document', style => 'document',
body => { body => {
'use' => 'literal',
namespace => '', 'use' => 'literal',
encodingStyle => '', namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
parts => [qw( MyElements::GetFortuneCookie )], encodingStyle => '',
parts => [qw( MyElements::GetFortuneCookie )],
}, },
header => { header => {
@@ -61,6 +66,7 @@ sub GetFortuneCookie {
}, $body, $header); }, $body, $header);
} }
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); die "CountCookies must be called as object method (\$self is <$self>)" if not blessed($self);
@@ -70,10 +76,11 @@ sub CountCookies {
style => 'document', style => 'document',
body => { body => {
'use' => 'literal',
namespace => '', 'use' => 'literal',
encodingStyle => '', namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
parts => [qw( MyElements::CountCookies )], encodingStyle => '',
parts => [qw( MyElements::CountCookies )],
}, },
header => { header => {
@@ -84,6 +91,7 @@ sub CountCookies {
}, $body, $header); }, $body, $header);
} }
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); die "GetSpecificCookie must be called as object method (\$self is <$self>)" if not blessed($self);
@@ -93,10 +101,11 @@ sub GetSpecificCookie {
style => 'document', style => 'document',
body => { body => {
'use' => 'literal',
namespace => '', 'use' => 'literal',
encodingStyle => '', namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
parts => [qw( MyElements::GetSpecificCookie )], encodingStyle => '',
parts => [qw( MyElements::GetSpecificCookie )],
}, },
header => { header => {
@@ -109,6 +118,7 @@ sub GetSpecificCookie {
1; 1;
@@ -119,21 +129,20 @@ __END__
=head1 NAME =head1 NAME
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 =head1 SYNOPSIS
use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap; 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 $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
my $response; my $response;
$response = $interface->readNodeCount(); $response = $interface->readNodeCount();
$response = $interface->GetFortuneCookie(); $response = $interface->GetFortuneCookie();
$response = $interface->CountCookies(); $response = $interface->CountCookies();
$response = $interface->GetSpecificCookie(); $response = $interface->GetSpecificCookie();
=head1 DESCRIPTION =head1 DESCRIPTION
@@ -168,42 +177,58 @@ 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.
=head3 readNodeCount =head3 readNodeCount
Display the number of nodes specified in fortune XML document Display the number of nodes specified in fortune XML document
$interface->readNodeCount(,, Returns a L<MyElements::readNodeCountResponse|MyElements::readNodeCountResponse> object.
$response = $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(,, Returns a L<MyElements::GetFortuneCookieResponse|MyElements::GetFortuneCookieResponse> object.
$response = $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(,, Returns a L<MyElements::CountCookiesResponse|MyElements::CountCookiesResponse> object.
$response = $interface->CountCookies(,,
); );
=head3 GetSpecificCookie =head3 GetSpecificCookie
Get a specific cookie by the XML node number Get a specific cookie by the XML node number
$interface->GetSpecificCookie( { Returns a L<MyElements::GetSpecificCookieResponse|MyElements::GetSpecificCookieResponse> object.
$response = $interface->GetSpecificCookie( {
index => $some_value, # int index => $some_value, # int
},, },,
); );
=head1 AUTHOR =head1 AUTHOR
Generated by SOAP::WSDL on Sun Dec 16 19:58:30 2007 Generated by SOAP::WSDL on Wed Dec 3 22:05:20 2008
=pod =cut

View File

@@ -1,3 +1,4 @@
package MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie; package MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
use strict; use strict;
use warnings; use warnings;
@@ -38,11 +39,13 @@ sub get_typemap {
__END__ __END__
__END__
=pod =pod
=head1 NAME =head1 NAME
MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie; - typemap for ::FullerData_x0020_Fortune_x0020_Cookie; MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie - typemap for FullerData_x0020_Fortune_x0020_Cookie
=head1 DESCRIPTION =head1 DESCRIPTION

View File

@@ -1,6 +1,7 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
use strict; use strict;
use warnings; use warnings;
use XML::Compile::SOAP11;
use XML::Compile::WSDL11; use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP; use XML::Compile::Transport::SOAPHTTP;

View File

@@ -0,0 +1,29 @@
use lib '../../lib';
use lib '../lib';
use SOAP::WSDL::Server::Simple;
use base qw(HTTP::Server::Simple::CGI);
use MyServer::HelloWorld::HelloWorldSoap;
sub handle_request {
my ($self, $cgi) = @_;
my $server = MyServer::HelloWorld::HelloWorldSoap->new({
dispatch_to => 'main',
transport_class => 'SOAP::WSDL::Server::Simple',
});
$server->handle($cgi);
}
my $httpd = __PACKAGE__->new(8081);
$httpd->run();
sub sayHello {
my ($self, $body, $header) = @_;
my $name = $body->get_name();
my $givenName = $body->get_givenName();
return MyElements::sayHelloResponse->new({
sayHelloResult => "Hello $givenName $name"
})
}

View File

@@ -7,7 +7,8 @@
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types> <wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/benchmark/"> targetNamespace="http://www.example.org/benchmark/"
elementFormDefault="qualified">
<xsd:element name="ListPerson"> <xsd:element name="ListPerson">
<xsd:complexType> <xsd:complexType>

440
example/wsdl/person.xml Normal file
View File

@@ -0,0 +1,440 @@
<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>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>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>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>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>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>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>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>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>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>
</out>
</ListPersonResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

View File

@@ -10,15 +10,14 @@ use Carp;
use Scalar::Util qw(blessed); use Scalar::Util qw(blessed);
use SOAP::WSDL::Client; use SOAP::WSDL::Client;
use SOAP::WSDL::Expat::WSDLParser; use SOAP::WSDL::Expat::WSDLParser;
use Class::Std::Fast; use Class::Std::Fast constructor => 'none';
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType; use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
use LWP::UserAgent; use LWP::UserAgent;
use version; our $VERSION= qv('2.00.03'); use version; our $VERSION = qv('3.002');
my %no_dispatch_of :ATTR(:name<no_dispatch>); my %no_dispatch_of :ATTR(:name<no_dispatch>);
my %wsdl_of :ATTR(:name<wsdl>); my %wsdl_of :ATTR(:name<wsdl>);
my %proxy_of :ATTR(:name<proxy>);
my %autotype_of :ATTR(:name<autotype>); my %autotype_of :ATTR(:name<autotype>);
my %outputxml_of :ATTR(:name<outputxml> :default<0>); my %outputxml_of :ATTR(:name<outputxml> :default<0>);
my %outputtree_of :ATTR(:name<outputtree>); my %outputtree_of :ATTR(:name<outputtree>);
@@ -42,7 +41,6 @@ my %LOOKUP = (
no_dispatch => \%no_dispatch_of, no_dispatch => \%no_dispatch_of,
class_resolver => \%class_resolver_of, class_resolver => \%class_resolver_of,
wsdl => \%wsdl_of, wsdl => \%wsdl_of,
proxy => \%proxy_of,
autotype => \%autotype_of, autotype => \%autotype_of,
outputxml => \%outputxml_of, outputxml => \%outputxml_of,
outputtree => \%outputtree_of, outputtree => \%outputtree_of,
@@ -94,12 +92,30 @@ for my $method (keys %LOOKUP ) {
} }
my $ident = ident $self; my $ident = ident $self;
$self->wsdlinit() if ($wsdl_of{ $ident });
$client_of{ $ident } = SOAP::WSDL::Client->new(); $client_of{ $ident } = SOAP::WSDL::Client->new();
$self->wsdlinit() if ($wsdl_of{ $ident });
return $self; return $self;
} }
} }
sub set_proxy {
my $self = shift;
return $self->get_client()->set_proxy(@_);
}
sub get_proxy {
my $self = shift;
return $self->get_client()->get_proxy();
}
sub proxy {
my $self = shift;
if (@_) {
return $self->set_proxy(@_);
}
return $self->get_proxy();
}
sub wsdlinit { sub wsdlinit {
my ($self, %opt) = @_; my ($self, %opt) = @_;
my $ident = ident $self; my $ident = ident $self;
@@ -109,6 +125,7 @@ sub wsdlinit {
? (keep_alive => 1) ? (keep_alive => 1)
: () : ()
); );
$lwp->agent(qq[SOAP::WSDL $VERSION]);
my $response = $lwp->get( $wsdl_of{ $ident } ); my $response = $lwp->get( $wsdl_of{ $ident } );
croak $response->message() if ($response->code != 200); croak $response->message() if ($response->code != 200);
@@ -132,6 +149,15 @@ sub wsdlinit {
$servicename_of{ $ident } = $opt{servicename} if $opt{servicename}; $servicename_of{ $ident } = $opt{servicename} if $opt{servicename};
$portname_of{ $ident } = $opt{portname} if $opt{portname}; $portname_of{ $ident } = $opt{portname} if $opt{portname};
$self->_wsdl_init_methods();
# pass-through keep_alive if we need it...
$self->get_client()->set_proxy(
$port_of{ $ident }->first_address()->get_location(),
$keep_alive_of{ $ident } ? (keep_alive => 1) : (),
);
return $self; return $self;
} ## end sub wsdlinit } ## end sub wsdlinit
@@ -139,8 +165,8 @@ sub _wsdl_get_service :PRIVATE {
my $ident = ident shift; my $ident = ident shift;
my $wsdl = $definitions_of{ $ident }; my $wsdl = $definitions_of{ $ident };
return $service_of{ $ident } = $servicename_of{ $ident } return $service_of{ $ident } = $servicename_of{ $ident }
? $wsdl->find_service( $wsdl->get_targetNamespace() , $servicename_of{ $ident } ) ? $wsdl->find_service( $wsdl->get_targetNamespace() , $servicename_of{ $ident } )
: $service_of{ $ident } = $wsdl->get_service()->[ 0 ]; : ( $service_of{ $ident } = $wsdl->get_service()->[ 0 ] );
} ## end sub _wsdl_get_service } ## end sub _wsdl_get_service
sub _wsdl_get_port :PRIVATE { sub _wsdl_get_port :PRIVATE {
@@ -148,9 +174,10 @@ sub _wsdl_get_port :PRIVATE {
my $wsdl = $definitions_of{ $ident }; my $wsdl = $definitions_of{ $ident };
my $ns = $wsdl->get_targetNamespace(); my $ns = $wsdl->get_targetNamespace();
return $port_of{ $ident } = $portname_of{ $ident } return $port_of{ $ident } = $portname_of{ $ident }
? $service_of{ $ident }->get_port( $ns, $portname_of{ $ident } ) ? $service_of{ $ident }->get_port( $ns, $portname_of{ $ident } )->[ 0 ]
: $port_of{ $ident } = $service_of{ $ident }->get_port()->[ 0 ]; : ( $port_of{ $ident } = $service_of{ $ident }->get_port()->[ 0 ] );
} }
sub _wsdl_get_binding :PRIVATE { sub _wsdl_get_binding :PRIVATE {
my $self = shift; my $self = shift;
my $ident = ident $self; my $ident = ident $self;
@@ -160,6 +187,7 @@ sub _wsdl_get_binding :PRIVATE {
or croak "no binding found for ", $port->get_binding(); or croak "no binding found for ", $port->get_binding();
return $binding_of{ $ident }; return $binding_of{ $ident };
} }
sub _wsdl_get_portType :PRIVATE { sub _wsdl_get_portType :PRIVATE {
my $self = shift; my $self = shift;
my $ident = ident $self; my $ident = ident $self;
@@ -169,6 +197,7 @@ sub _wsdl_get_portType :PRIVATE {
or croak "cannot find portType for " . $binding->get_type(); or croak "cannot find portType for " . $binding->get_type();
return $porttype_of{ $ident }; return $porttype_of{ $ident };
} }
sub _wsdl_init_methods :PRIVATE { sub _wsdl_init_methods :PRIVATE {
my $self = shift; my $self = shift;
my $ident = ident $self; my $ident = ident $self;
@@ -242,7 +271,7 @@ sub _wsdl_init_methods :PRIVATE {
# on_action is a no-op and just here for compatibility reasons. # on_action is a no-op and just here for compatibility reasons.
# It returns the first parameter to allow method chaining. # It returns the first parameter to allow method chaining.
sub on_action { return shift }; sub on_action { return shift }
sub call { sub call {
my ($self, $method, @data_from) = @_; my ($self, $method, @data_from) = @_;
@@ -259,12 +288,6 @@ sub call {
my $client = $client_of{ $ident }; my $client = $client_of{ $ident };
# pass-through keep_alive if we need it...
$client->set_proxy( $proxy_of{ $ident }
|| $port_of{ $ident }->first_address()->get_location(),
$keep_alive_of{ $ident } ? (keep_alive => 1) : (),
);
$client->set_no_dispatch( $no_dispatch_of{ $ident } ); $client->set_no_dispatch( $no_dispatch_of{ $ident } );
$client->set_outputxml( $outputxml_of{ $ident } ? 1 : 0 ); $client->set_outputxml( $outputxml_of{ $ident } ? 1 : 0 );
@@ -277,7 +300,7 @@ sub call {
&& ( ! $no_dispatch_of{ $ident } ) ) { && ( ! $no_dispatch_of{ $ident } ) ) {
require SOAP::WSDL::Deserializer::SOM; require SOAP::WSDL::Deserializer::SOM;
$client->set_deserializer( SOAP::WSDL::Deserializer::SOM->new() ); $client->set_deserializer( SOAP::WSDL::Deserializer::SOM->new() );
}; }
my $method_info = $method_info_of{ $ident }->{ $method }; my $method_info = $method_info_of{ $ident }->{ $method };
@@ -326,7 +349,24 @@ __END__
SOAP::WSDL - SOAP with WSDL support SOAP::WSDL - SOAP with WSDL support
=head1 Overview =head1 NOTICE
This module is B<not> recommended for new application development.
Please use L<XML::Compile::SOAP> or L<SOAP::Lite> instead if possible.
This module has a large number of known bugs and is not being actively developed.
This 3.0 release is intended to update the module to pass tests on newer Perls.
This is a service to existing applications already dependent on this module.
=head1 SYNOPSIS
my $soap = SOAP::WSDL->new(
wsdl => 'file://bla.wsdl',
);
my $result = $soap->call('MyMethod', %data);
=head1 DESCRIPTION
For creating Perl classes instrumenting a web service with a WSDL definition, For creating Perl classes instrumenting a web service with a WSDL definition,
read L<SOAP::WSDL::Manual>. read L<SOAP::WSDL::Manual>.
@@ -345,16 +385,6 @@ MIGRATING documentation.
The stuff below is for users of the 1.2x SOAP::WSDL series. All others, The stuff below is for users of the 1.2x SOAP::WSDL series. All others,
please refer to L<SOAP::WSDL::Manual> please refer to L<SOAP::WSDL::Manual>
=head1 SYNOPSIS
my $soap = SOAP::WSDL->new(
wsdl => 'file://bla.wsdl',
);
my $result = $soap->call('MyMethod', %data);
=head1 DESCRIPTION
SOAP::WSDL provides easy access to Web Services with WSDL descriptions. SOAP::WSDL provides easy access to Web Services with WSDL descriptions.
The WSDL is parsed and stored in memory. The WSDL is parsed and stored in memory.
@@ -645,8 +675,23 @@ details.
=head1 BUGS AND LIMITATIONS =head1 BUGS AND LIMITATIONS
The bug tracker is at L<< https://rt.cpan.org/Dist/Display.html?Queue=SOAP-WSDL >>.
This module is in legacy maintenance mode.
Only show stopper bugs are being fixed, until/unless someone wishes to resume active development on it.
Scott Walters, C<scott@slowass.net> has obtained co-mainter from the CPAN admins for the purpose of applying existing fixes people have submit to
the RT tracker, and to apply other fixes as needed to get the module to install and run on newer Perls.
Non show-stopper bugs reports without fixes will be added to this list of limitations.
Of course, fixes for these and other bugs are welcome.
Scott does not get email from L<< rt.cpan.org >>, so please drop an email to him at C<< scott@slowass.net >> if you open a ticket there.
=over =over
=item * Breaks the idiom C<< $package->can("SUPER::method") >> in your code
If you redefine C<< UNIVERSAL::can() >>, and someone tries to do C<< $package->can("SUPER::method") >>, it'll look at your packages C<@ISA>, not theirs.
This module does precicely that, by way of its dependency on C<Class::Std::Fast>.
=item * $obj == undef does not work in perl 5.8.6 and perl 5.8.7 =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 Due to some strange behaviour in perl 5.8.6 and perl 5.8.7, stringification
@@ -666,9 +711,7 @@ before - see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746
=item * Apache SOAP datatypes are not supported =item * Apache SOAP datatypes are not supported
You currently can't use SOAP::WSDL with Apache SOAP datatypes like map. You can't use SOAP::WSDL with Apache SOAP datatypes like map.
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
@@ -761,6 +804,12 @@ L<http://www.cpanforum.com/dist/SOAP-WSDL>
=head1 ACKNOWLEDGMENTS =head1 ACKNOWLEDGMENTS
Scott Walters wrote:
This code incorporates fixes contributed by C<< NORDIC@cpan.org >>, C<< dam@cpan.org >>, C<< sven.schober@uni-ulm.de >>, myself, and others.
Martin Kutter wrote:
There are many people out there who fostered SOAP::WSDL's developement. There are many people out there who fostered SOAP::WSDL's developement.
I would like to thank them all (and apologize to all those I have forgotten). I would like to thank them all (and apologize to all those I have forgotten).
@@ -772,8 +821,6 @@ Peter Orvos, Mark Overmeer, Jon Robens, Isidro Vila Verde and Glenn Wood
(in alphabetical order) spotted bugs and/or suggested improvements in (in alphabetical order) spotted bugs and/or suggested improvements in
the 1.2x releases. 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 JT Justman and Noah Robin provided early feedback and bug reports for
the 2.xx pre-releases. the 2.xx pre-releases.
@@ -786,13 +833,17 @@ Matt S. Trout encouraged me "to get a non-dev-release out."
CPAN Testers provided most valuable (automated) feedback. Thanks a lot. 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 and error reports for
testing. Thank you.
Noah Robin contributed lots of documentation fixes, and the mod_perl server,
and eventually joined SOAP::WSDL's developement. Thanks.
Mark Overmeer wrote XML::Compile::SOAP - competition is good for business.
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-2008 Martin Kutter. Copyright 2004-2008 Martin Kutter.
@@ -802,13 +853,12 @@ the same terms as perl itself
=head1 AUTHOR =head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> Scott Walters E<lt>scott@slowass.net<gt> 2014
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> 2004-2008
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ https://github.com/scrottie/SOAP-WSDL
$LastChangedBy: kutterma $
$Id: WSDL.pm 677 2008-05-18 20:17:56Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
=cut =cut

View File

@@ -1,20 +1,21 @@
package SOAP::WSDL::Base; package SOAP::WSDL::Base;
use strict; use strict; use warnings;
use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use List::Util qw(first); use List::Util;
use Scalar::Util;
use Carp qw(croak carp confess); use Carp qw(croak carp confess);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %id_of :ATTR(:name<id> :default<()>); my %id_of :ATTR(:name<id> :default<()>);
my %lang_of :ATTR(:name<lang> :default<()>); my %lang_of :ATTR(:name<lang> :default<()>);
my %name_of :ATTR(:name<name> :default<()>); my %name_of :ATTR(:name<name> :default<()>);
my %namespace_of :ATTR(:name<namespace> :default<()>);
my %documentation_of :ATTR(:name<documentation> :default<()>); my %documentation_of :ATTR(:name<documentation> :default<()>);
my %annotation_of :ATTR(:name<annotation> :default<()>); my %annotation_of :ATTR(:name<annotation> :default<()>);
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>); my %targetNamespace_of :ATTR(:name<targetNamespace> :default<"">);
my %xmlns_of :ATTR(:name<xmlns> :default<{}>); my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
my %parent_of :ATTR(:name<parent> :default<()>); my %parent_of :ATTR(:get<parent> :default<()>);
my %namespaces_of :ATTR(:default<{}>); my %namespaces_of :ATTR(:default<{}>);
@@ -22,34 +23,42 @@ sub namespaces {
return shift->get_xmlns(); return shift->get_xmlns();
} }
sub BUILD {
my ($self, $ident, $arg_ref) = @_;
if (defined $arg_ref->{ parent }) {
$parent_of{ $ident } = delete $arg_ref->{ parent },
Scalar::Util::weaken($parent_of{ $ident });
}
}
sub START { sub START {
my ($self, $ident, $arg_ref) = @_; my ($self, $ident, $arg_ref) = @_;
#$xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
$xmlns_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace'; $xmlns_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace';
$namespaces_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' }; $namespaces_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
$namespaces_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace'; $namespaces_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace';
} }
sub DEMOLISH { #
my $self = shift; # set_parent is hand-implemented to break up (weaken) the circular reference
# delete upward references # between an object and it's parent
delete $parent_of{ ${ $self } }; #
return; sub set_parent {
$parent_of{ ${ $_[0]} } = $_[1];
Scalar::Util::weaken($parent_of{ ${ $_[0]} });
} }
sub STORABLE_freeze_pre :CUMULATIVE {}; # _accept is here to be called by visitor.
sub STORABLE_freeze_post :CUMULATIVE {}; # The visitor pattern is a level of indirection - here the visitor calls
sub STORABLE_thaw_pre :CUMULATIVE {}; # $object->_accept($visitor) on each object, which in turn calls
sub STORABLE_thaw_post :CUMULATIVE { return $_[0] }; # $visitor->visit_$class( $object ) where $class is the object's class.
#
sub _accept { sub _accept {
my $self = shift; my $self = shift;
my $class = ref $self; my $class = ref $self;
$class =~ s{ \A SOAP::WSDL:: }{}xms; $class =~ s{ \A SOAP::WSDL:: }{}xms;
$class =~ s{ (:? :: ) }{_}gxms; $class =~ s{ (:? :: ) }{_}gxms;
my $method = "visit_$class"; my $method = "visit_$class";
no strict qw(refs); ## no critic ProhibitNoStrict no strict qw(refs);
return shift->$method( $self ); return shift->$method( $self );
} }
@@ -64,13 +73,12 @@ sub AUTOMETHOD {
if ($subname =~s{^push_}{}xms) { if ($subname =~s{^push_}{}xms) {
my $getter = "get_$subname"; my $getter = "get_$subname";
my $setter = "set_$subname"; my $setter = "set_$subname";
## Checking here is paranoid - will fail fatally if # Checking here is paranoid - will fail fatally if there is no setter.
## there is no setter... # And we would have to check getters, too.
## And we would have to check getters, too. # Maybe do it the Conway way via the Symbol table...
## Maybe do it the Conway way via the Symbol table... # ... can is way slow...
## ... can is way slow...
return sub { return sub {
no strict qw(refs); ## no critic ProhibitNoStrict no strict qw(refs);
my $old_value = $self->$getter(); my $old_value = $self->$getter();
# Listify if not a list ref # Listify if not a list ref
$old_value = $old_value ? [ $old_value ] : [] if not ref $old_value; $old_value = $old_value ? [ $old_value ] : [] if not ref $old_value;
@@ -84,7 +92,7 @@ sub AUTOMETHOD {
elsif ($subname =~s {^find_}{get_}xms) { elsif ($subname =~s {^find_}{get_}xms) {
@values = @{ $values[0] } if ref $values[0] eq 'ARRAY'; @values = @{ $values[0] } if ref $values[0] eq 'ARRAY';
return sub { return sub {
return first { return List::Util::first {
$_->get_targetNamespace() eq $values[0] && $_->get_targetNamespace() eq $values[0] &&
$_->get_name() eq $values[1] $_->get_name() eq $values[1]
} }
@@ -100,24 +108,29 @@ sub AUTOMETHOD {
}; };
} }
# 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; return;
} }
sub init { sub init {
my ($self, @args) = @_; my ($self, @args) = @_;
foreach my $value (@args) foreach my $value (@args) {
{
croak @args if (not defined ($value->{ Name })); croak @args if (not defined ($value->{ Name }));
if ($value->{ Name } =~m{^xmlns\:}xms) { if ($value->{ Name } =~m{^xmlns\:}xms) {
# add namespaces # add namespaces
$xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value }; $xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value };
next; next;
} }
# check for namespae-qualified attributes.
# neither XML Schema, nor WSDL1.1, nor the SOAP binding allow
# namespace-qualified attribute names
my ($ns, $localname) = split /\|/, $value->{ Name };
if ($ns) {
warn "found unrecognised attribute \{$ns}$localname (ignored)";
next;
}
my $name = $value->{ LocalName }; my $name = $value->{ LocalName };
my $method = "set_$name"; my $method = "set_$name";
$self->$method( $value->{ Value } ); $self->$method( $value->{ Value } );
@@ -128,12 +141,15 @@ sub init {
sub expand { sub expand {
my ($self, $qname) = @_; my ($self, $qname) = @_;
my $ns_of = $self->namespaces(); my $ns_of = $self->namespaces();
my $parent;
if (not $qname=~m{:}xm) { if (not $qname=~m{:}xm) {
if (defined $ns_of->{ '#default' }) { if (defined $ns_of->{ '#default' }) {
return $self->get_targetNamespace(), $qname; # TODO check. Returning the targetNamespace for the default ns
# return $ns_of->{ '#default' }, $qname; # is probably wrong
#return $self->get_targetNamespace(), $qname;
return $ns_of->{ '#default' }, $qname;
} }
if (my $parent = $self->get_parent()) { if ($parent = $self->get_parent()) {
return $parent->expand($qname); return $parent->expand($qname);
} }
die "un-prefixed element name <$qname> found, but no default namespace set\n" die "un-prefixed element name <$qname> found, but no default namespace set\n"
@@ -142,7 +158,7 @@ sub expand {
my ($prefix, $localname) = split /:/x, $qname; my ($prefix, $localname) = split /:/x, $qname;
return ($ns_of->{ $prefix }, $localname) if ($ns_of->{ $prefix }); return ($ns_of->{ $prefix }, $localname) if ($ns_of->{ $prefix });
if (my $parent = $self->get_parent()) { if ($parent = $self->get_parent()) {
return $parent->expand($qname); return $parent->expand($qname);
} }
croak "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are " croak "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are "
@@ -151,6 +167,13 @@ sub expand {
sub _expand; sub _expand;
*_expand = \&expand; *_expand = \&expand;
sub schema {
my $parent = $_[0]->get_parent();
return if ! defined $parent;
return $parent if $parent->isa('SOAP::WSDL::XSD::Schema');
return $parent->schema();
}
1; 1;
__END__ __END__

View File

@@ -2,10 +2,10 @@ package SOAP::WSDL::Binding;
use strict; use strict;
use warnings; use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use List::Util qw(first);
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
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<()>);

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;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
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<()>);
@@ -20,12 +20,14 @@ my %outputxml_of :ATTR(:name<outputxml> :default<()>);
my %transport_of :ATTR(:name<transport> :default<()>); my %transport_of :ATTR(:name<transport> :default<()>);
my %endpoint_of :ATTR(:name<endpoint> :default<()>); my %endpoint_of :ATTR(:name<endpoint> :default<()>);
my %soap_version_of :ATTR(:get<soap_version> :init_attr<soap_version> :default<'1.1'>); my %soap_version_of :ATTR(:get<soap_version> :init_attr<soap_version> :default<1.1>);
my %on_action_of :ATTR(:name<on_action> :default<()>); my %on_action_of :ATTR(:name<on_action> :default<()>);
my %content_type_of :ATTR(:name<content_type> :default<text/xml; charset=utf8>); #/#trick editors my %content_type_of :ATTR(:name<content_type> :default<text/xml; charset=utf-8>); #/#trick editors
my %encoding_of :ATTR(:name<encoding> :default<utf-8>);
my %serializer_of :ATTR(:name<serializer> :default<()>); my %serializer_of :ATTR(:name<serializer> :default<()>);
my %deserializer_of :ATTR(:name<deserializer> :default<()>); my %deserializer_of :ATTR(:name<deserializer> :default<()>);
my %deserializer_args_of :ATTR(:name<deserializer_args> :default<{}>);
sub BUILD { sub BUILD {
my ($self, $ident, $attrs_of_ref) = @_; my ($self, $ident, $attrs_of_ref) = @_;
@@ -147,6 +149,7 @@ sub call {
my $response = $transport->send_receive( my $response = $transport->send_receive(
endpoint => $self->get_endpoint(), endpoint => $self->get_endpoint(),
content_type => $content_type_of{ $ident }, content_type => $content_type_of{ $ident },
encoding => $encoding_of{ $ident },
envelope => $envelope, envelope => $envelope,
action => $soap_action, action => $soap_action,
# on_receive_chunk => sub {} # optional, may be used for parsing large responses as they arrive. # on_receive_chunk => sub {} # optional, may be used for parsing large responses as they arrive.
@@ -155,8 +158,10 @@ sub call {
return $response if ($outputxml_of{ $ident } ); return $response if ($outputxml_of{ $ident } );
# get deserializer # get deserializer
use Data::Dumper;
$deserializer_of{ $ident } ||= SOAP::WSDL::Factory::Deserializer->get_deserializer({ $deserializer_of{ $ident } ||= SOAP::WSDL::Factory::Deserializer->get_deserializer({
soap_version => $soap_version_of{ $ident }, soap_version => $soap_version_of{ $ident },
%{ $deserializer_args_of{ $ident } },
}); });
# set class resolver if serializer supports it # set class resolver if serializer supports it
@@ -166,20 +171,29 @@ sub call {
# Try deserializing response - there may be some, # Try deserializing response - there may be some,
# even if transport did not succeed (got a 500 response) # even if transport did not succeed (got a 500 response)
if ( $response ) { if ( $response ) {
my ($result_body, $result_header) = eval { # as our faults are false, returning a success marker is the only
$deserializer_of{ $ident }->deserialize( $response ); # reliable way of determining whether the deserializer succeeded.
# Custom deserializers may return an empty list, or undef,
# and $@ is not guaranteed to be undefined.
my ($success, $result_body, $result_header) = eval {
(1, $deserializer_of{ $ident }->deserialize( $response ));
}; };
if (not $@) { if (defined $success) {
return wantarray return wantarray
? ($result_body, $result_header) ? ($result_body, $result_header)
: $result_body; : $result_body;
} }
return $deserializer_of{ $ident }->generate_fault({ elsif (blessed $@) { #}&& $@->isa('SOAP::WSDL::SOAP::Typelib::Fault11')) {
code => 'soap:Server', return $@;
role => 'urn:localhost', }
message => "Error deserializing message: $@. \n" else {
. "Message was: \n$response" return $deserializer_of{ $ident }->generate_fault({
}); code => 'soap:Server',
role => 'urn:localhost',
message => "Error deserializing message: $@. \n"
. "Message was: \n$response"
});
}
}; };
# if we had no success (Transport layer error status code) # if we had no success (Transport layer error status code)
@@ -395,10 +409,10 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Client.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: Client.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
=cut =cut

View File

@@ -4,7 +4,7 @@ use warnings;
use base 'SOAP::WSDL::Client'; use base 'SOAP::WSDL::Client';
use Scalar::Util qw(blessed); use Scalar::Util qw(blessed);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
sub call { sub call {
my ($self, $method, $body, $header) = @_; my ($self, $method, $body, $header) = @_;
@@ -22,7 +22,7 @@ sub call {
# parameters given # parameters given
my @part_from = (); my @part_from = ();
foreach my $class (@{ $method->{ body }->{ parts } }) { foreach my $class (@{ $method->{ body }->{ parts } }) {
eval "require $class" || die $@; eval "require $class" || die $@; ## no critic (ProhibitStringyEval)
push @part_from, $class->new(shift(@body_from) || {}); push @part_from, $class->new(shift(@body_from) || {});
} }
@@ -33,10 +33,10 @@ sub call {
# 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 # treat 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 $@; ## no critic (ProhibitStringyEval)
$header = $class->new($header); $header = $class->new($header);
} }
} }
@@ -65,6 +65,13 @@ SOAP::WSDL::Client::Base - Factory class for WSDL-based SOAP access
Factory class for creating interface classes. Should probably be renamed to Factory class for creating interface classes. Should probably be renamed to
SOAP::WSDL::Factory::Interface... SOAP::WSDL::Factory::Interface...
=head1 METHODS
=head2 call
Abstraction layer method between the generated interfaces and
L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head1 LICENSE AND COPYRIGHT =head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter. Copyright 2004-2007 Martin Kutter.
@@ -78,9 +85,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Base.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: Base.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
=cut =cut

View File

@@ -1,26 +1,22 @@
package SOAP::WSDL::Definitions; package SOAP::WSDL::Definitions;
use utf8;
use strict; use strict;
use warnings; use warnings;
use Carp;
use File::Basename;
use File::Path;
use List::Util qw(first); 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);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
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::Fast::Storable # must be attr for Class::Std::Fast::Storable
my %attributes_of :ATTR(); #my %attributes_of :ATTR();
%attributes_of = ( my %attributes_of = (
binding => \%binding_of, binding => \%binding_of,
message => \%message_of, message => \%message_of,
portType => \%portType_of, portType => \%portType_of,
@@ -44,6 +40,7 @@ BLOCK: {
} }
} }
1; 1;
=pod =pod
@@ -72,7 +69,7 @@ Returns the service matching the namespace/localname pair passed as arguments.
Accessors/Mutators for accessing / setting the E<gt>bindingE<lt> child Accessors/Mutators for accessing / setting the E<gt>bindingE<lt> child
element(s). element(s).
=head2 find_service =head2 find_binding
Returns the binding matching the namespace/localname pair passed as arguments. Returns the binding matching the namespace/localname pair passed as arguments.
@@ -94,7 +91,7 @@ Returns the portType matching the namespace/localname pair passed as arguments.
Accessors/Mutators for accessing / setting the E<gt>messageE<lt> child Accessors/Mutators for accessing / setting the E<gt>messageE<lt> child
element(s). element(s).
=head2 find_service =head2 find_message
Returns the message matching the namespace/localname pair passed as arguments. Returns the message matching the namespace/localname pair passed as arguments.
@@ -118,10 +115,10 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Definitions.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: Definitions.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
=cut =cut

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__ );
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
sub BUILD { sub BUILD {
my ($self, $ident, $args_of_ref) = @_; my ($self, $ident, $args_of_ref) = @_;
@@ -38,7 +38,7 @@ sub deserialize {
sub generate_fault { sub generate_fault {
my ($self, $args_from_ref) = @_; my ($self, $args_from_ref) = @_;
return SOAP::WSDL::SOAP::Typelib::Fault11->new({ return SOAP::WSDL::SOAP::Typelib::Fault11->new({
faultcode => $args_from_ref->{ code } || 'soap:Client', faultcode => $args_from_ref->{ code } || 'SOAP-ENV:Client',
faultactor => $args_from_ref->{ role } || 'urn:localhost', faultactor => $args_from_ref->{ role } || 'urn:localhost',
faultstring => $args_from_ref->{ message } || "Unknown error" faultstring => $args_from_ref->{ message } || "Unknown error"
}); });
@@ -139,9 +139,20 @@ a parse error appears
=back =back
=head1 METHODS
=head2 deserialize
Deserializes the message.
=head2 generate_fault
Generates a L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
object and returns it.
=head1 LICENSE AND COPYRIGHT =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.
@@ -152,9 +163,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Hash.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: Hash.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
=cut =cut

View File

@@ -2,7 +2,7 @@ package SOAP::WSDL::Deserializer::SOM;
use strict; use strict;
use warnings; use warnings;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
our @ISA; our @ISA;
eval { eval {
@@ -13,6 +13,18 @@ or die "Cannot load SOAP::Lite.
Cannot deserialize to SOM object without SOAP::Lite. Cannot deserialize to SOM object without SOAP::Lite.
Please install SOAP::Lite."; Please install SOAP::Lite.";
sub deserialize {
my $self = shift;
my $result = eval { $self->SUPER::deserialize(@_) };
if ($@) {
return SOAP::Fault->new(
faultactor => 'SOAP-ENV:Server',
faultstring => $@,
);
}
return $result;
}
sub generate_fault { sub generate_fault {
my ($self, $args_from_ref) = @_; my ($self, $args_from_ref) = @_;
# code, message, detail, actor # code, message, detail, actor
@@ -66,6 +78,17 @@ This may be XML including mixed content, attachements and other XML data not
SOAP::WSDL::Deserializer::SOM is a subclass of L<SOAP::Deserializer|SOAP::Deserializer> SOAP::WSDL::Deserializer::SOM is a subclass of L<SOAP::Deserializer|SOAP::Deserializer>
from the L<SOAP::Lite|SOAP::Lite> package. from the L<SOAP::Lite|SOAP::Lite> package.
=head1 METHODS
=head2 deserialize
Deserializes a XML sting into a SOAP::SOM object. Returns a SOAP::Fault object
on deserialization errors.
=head2 generate_fault
Dies with a SOAP::Fault object.
=head1 USAGE =head1 USAGE
SOAP::WSDL::Deserializer will not autoregister itself - to use it for a particular SOAP::WSDL::Deserializer will not autoregister itself - to use it for a particular
@@ -85,8 +108,8 @@ SOAP version just use the following lines:
=item * No on_fault handler =item * No on_fault handler
You cannot specify what to do when an error occurs - SOAP::WSDL will die You cannot specify what to do when an error occurs - SOAP::WSDL will return
with a SOAP::Fault object on transport errors. a SOAP::Fault object on transport errors.
=back =back
@@ -99,6 +122,9 @@ with a SOAP::Fault object on transport errors.
SOAP::WSDL::Deserializer::SOM will die with a SOAP::Fault object on calls SOAP::WSDL::Deserializer::SOM will die with a SOAP::Fault object on calls
to generate_fault. to generate_fault.
This also means that a SOAP::Fault may be thrown as exception when using
=back =back
=head1 LICENSE AND COPYRIGHT =head1 LICENSE AND COPYRIGHT
@@ -114,9 +140,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: SOM.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: SOM.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $
=cut =cut

View File

@@ -5,31 +5,41 @@ 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;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>); my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
my %strict_of :ATTR(:get<strict> :init_arg<strict> :default<1>);
my %parser_of :ATTR();
my %parser_of :ATTR(); sub set_strict {
undef $parser_of{${$_[0]}};
$strict_of{${$_[0]}} = $_[1];
}
sub BUILD { sub BUILD {
my ($self, $ident, $args_of_ref) = @_; my ($self, $ident, $args_of_ref) = @_;
# ignore all options except 'class_resolver' # ignore all options except 'class_resolver'
for (keys %{ $args_of_ref }) { for (keys %{ $args_of_ref }) {
delete $args_of_ref->{ $_ } if $_ ne 'class_resolver'; next if $_ eq 'strict';
next if $_ eq 'class_resolver';
delete $args_of_ref->{ $_ };
} }
} }
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({
strict => $strict_of{ ${ $self } }
})
if not $parser_of{ ${ $self } }; if not $parser_of{ ${ $self } };
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ${ $self } } ); $parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ${ $self } } );
$content =~ s{^<\?xml version="1.0" *\?>}{}; # XML::Parser::Expat apparently doesn't like this.
eval { $parser_of{ ${ $self } }->parse_string( $content ) }; eval { $parser_of{ ${ $self } }->parse_string( $content ) };
if ($@) { if ($@) {
return $self->generate_fault({ return $self->generate_fault({
code => 'soap:Server', code => 'SOAP-ENV:Server',
role => 'urn:localhost', role => 'urn:localhost',
message => "Error deserializing message: $@. \n" message => "Error deserializing message: $@. \n"
. "Message was: \n$content" . "Message was: \n$content"
@@ -41,7 +51,7 @@ sub deserialize {
sub generate_fault { sub generate_fault {
my ($self, $args_from_ref) = @_; my ($self, $args_from_ref) = @_;
return SOAP::WSDL::SOAP::Typelib::Fault11->new({ return SOAP::WSDL::SOAP::Typelib::Fault11->new({
faultcode => $args_from_ref->{ code } || 'soap:Client', faultcode => $args_from_ref->{ code } || 'SOAP-ENV:Client',
faultactor => $args_from_ref->{ role } || 'urn:localhost', faultactor => $args_from_ref->{ role } || 'urn:localhost',
faultstring => $args_from_ref->{ message } || "Unknown error" faultstring => $args_from_ref->{ message } || "Unknown error"
}); });
@@ -75,6 +85,20 @@ SOAP::WSDL.
If 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 OPTIONS
=over
=item * strict
Enables/disables strict XML processing. Strict processing is enabled by
default. To disable strict XML processing pass the following to the
constructor or use the C<set_strict> method:
strict => 0
=back
=head1 METHODS =head1 METHODS
=head2 deserialize =head2 deserialize
@@ -86,6 +110,10 @@ Deserializes the message.
Generates a L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11> Generates a L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
object and returns it. object and returns it.
=head2 set_strict
Enable/disable strict XML parsing. Default is enabled.
=head1 LICENSE AND COPYRIGHT =head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter. Copyright 2004-2007 Martin Kutter.
@@ -99,9 +127,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: XSD.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: XSD.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
=cut =cut

View File

@@ -6,7 +6,7 @@ use XML::Parser::Expat;
# TODO: convert to Class::Std::Fast based class - hash based classes suck. # TODO: convert to Class::Std::Fast based class - hash based classes suck.
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
sub new { sub new {
my ($class, $arg_ref) = @_; my ($class, $arg_ref) = @_;
@@ -35,17 +35,23 @@ sub get_uri { return $_[0]->{ uri }; }
sub set_user_agent { $_[0]->{ user_agent } = $_[1]; } sub set_user_agent { $_[0]->{ user_agent } = $_[1]; }
sub get_user_agent { return $_[0]->{ user_agent }; } sub get_user_agent { return $_[0]->{ user_agent }; }
# Mark a URI as "already parsed"
sub set_parsed { sub set_parsed {
my ($self, $uri) = @_; my ($self, $uri) = @_;
$self->{ parsed }->{ $uri } = 1; $self->{ parsed }->{ $uri } = 1;
return; return;
} }
# returns true if a specific URI has already been parsed
sub is_parsed { sub is_parsed {
my ($self, $uri) = @_; my ($self, $uri) = @_;
return exists $self->{ parsed }->{ $uri }; return exists $self->{ parsed }->{ $uri };
} }
# parse a URI. This is the preferred parsing method for WSDL files, as it's
# the only one allowing automatic import resolution
sub parse_uri { sub parse_uri {
my $self = shift; my $self = shift;
my $uri = shift; my $uri = shift;
@@ -74,6 +80,7 @@ sub parse {
$_[0]->{ parser }->release(); $_[0]->{ parser }->release();
}; };
$_[0]->{ parser }->xpcroak( $@ ) if $@; $_[0]->{ parser }->xpcroak( $@ ) if $@;
delete $_[0]->{ parser };
return $_[0]->{ data }; return $_[0]->{ data };
} }
@@ -83,6 +90,7 @@ sub parsefile {
$_[0]->{ parser }->release(); $_[0]->{ parser }->release();
}; };
$_[0]->{ parser }->xpcroak( $@ ) if $@; $_[0]->{ parser }->xpcroak( $@ ) if $@;
delete $_[0]->{ parser };
return $_[0]->{ data }; return $_[0]->{ data };
} }

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);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
sub _initialize { sub _initialize {
my ($self, $parser) = @_; my ($self, $parser) = @_;

View File

@@ -1,19 +1,20 @@
#!/usr/bin/perl #!/usr/bin/perl
package SOAP::WSDL::Expat::MessageParser; package SOAP::WSDL::Expat::MessageParser;
use strict; use strict; use warnings;
use warnings;
use Carp qw(croak confess);
use version; our $VERSION = qv('2.00.03');
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;
use base qw(SOAP::WSDL::Expat::Base); use base qw(SOAP::WSDL::Expat::Base);
require Class::Std::Fast; BEGIN { require Class::Std::Fast };
our $VERSION = $SOAP::WSDL::VERSION;
# GLOBALS
my $OBJECT_CACHE_REF = Class::Std::Fast::OBJECT_CACHE_REF(); my $OBJECT_CACHE_REF = Class::Std::Fast::OBJECT_CACHE_REF();
# keep track of classes loaded
my %LOADED_OF = (); my %LOADED_OF = ();
sub new { sub new {
@@ -46,7 +47,10 @@ sub class_resolver {
sub load_classes { sub load_classes {
my $self = shift; my $self = shift;
for (values %{ $self->{ class_resolver }->get_typemap }) { return if $LOADED_OF{ $self->{ class_resolver } };
# requires sorting to make sub-packages load after their parent
for (sort values %{ $self->{ class_resolver }->get_typemap }) {
no strict qw(refs); no strict qw(refs);
my $class = $_; my $class = $_;
@@ -54,9 +58,10 @@ sub load_classes {
next if $class eq '__SKIP__'; next if $class eq '__SKIP__';
next if defined *{ "$class\::" }; # check if namespace exists next if defined *{ "$class\::" }; # check if namespace exists
# Require takes a bareword or a file name - we have to take
# the filname road here...
$class =~s{ :: }{/}xmsg; $class =~s{ :: }{/}xmsg;
$class .= '.pm'; require "$class.pm"; ## no critic (RequireBarewordIncludes)
require $class;
} }
$LOADED_OF{ $self->{ class_resolver } } = 1; $LOADED_OF{ $self->{ class_resolver } } = 1;
} }
@@ -103,19 +108,18 @@ sub _initialize {
return; return;
} }
) )
: (); : (
0 => sub { $depth++ },
1 => sub { $depth++ },
);
# use "globals" for speed # use "globals" for speed
my ($_prefix, $_method, my ($_prefix, $_method, $_class, $_leaf) = ();
$_class, $_leaf) = ();
my $char_handler = sub { my $char_handler = sub {
return if (!$_leaf); # we only want characters in leaf nodes return if (!$_leaf); # we only want characters in leaf nodes
$characters .= $_[1]; # add to characters
$characters .= $_[1]; return; # return void
# if $_[1] =~m{ [^\s] }xms;
return;
}; };
no strict qw(refs); no strict qw(refs);
@@ -136,11 +140,14 @@ sub _initialize {
return if $skip; # skip inside __SKIP__ return if $skip; # skip inside __SKIP__
# resolve class of this element # resolve class of this element
$_class = $self->{ class_resolver }->get_class( $path ) $_class = $self->{ class_resolver }->get_class( $path );
or die "Cannot resolve class for "
. join('/', @{ $path }) . " via " . $self->{ class_resolver };
if ($_class eq '__SKIP__') { if (! defined($_class) and $self->{ strict }) {
die "Cannot resolve class for "
. join('/', @{ $path }) . " via " . $self->{ class_resolver };
}
if (! defined($_class) or ($_class eq '__SKIP__') ) {
$skip = join('/', @{ $path }); $skip = join('/', @{ $path });
$_[0]->setHandlers( Char => undef ); $_[0]->setHandlers( Char => undef );
return; return;
@@ -194,6 +201,9 @@ sub _initialize {
} }
} }
$depth++; $depth++;
# TODO: Skip content of anyType / any stuff
return; return;
}, },
@@ -229,6 +239,9 @@ sub _initialize {
# empty characters # empty characters
$characters = q{}; $characters = q{};
# stop believing we're a leaf node
$_leaf = 0;
# return if there's only one elment - can't set it in parent ;-) # 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. # but set as root element if we don't have one already.
if (not defined $list->[-1]) { if (not defined $list->[-1]) {
@@ -250,8 +263,6 @@ sub _initialize {
$current = pop @$list; # step up in object hierarchy $current = pop @$list; # step up in object hierarchy
$_leaf = 0; # stop believing we're a leaf node
return; return;
} }
); );
@@ -319,11 +330,11 @@ the same terms as perl itself
=head1 Repository information =head1 Repository information
$Id: MessageParser.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: MessageParser.pm 851 2009-05-15 22:45:18Z kutterma $
$LastChangedDate: 2008-05-18 22:17:56 +0200 (So, 18 Mai 2008) $ $LastChangedDate: 2009-05-16 00:45:18 +0200 (Sa, 16. Mai 2009) $
$LastChangedRevision: 677 $ $LastChangedRevision: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $

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);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
sub parse_start { sub parse_start {
my $self = shift; my $self = shift;
@@ -69,9 +69,9 @@ the same terms as perl itself
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: MessageStreamParser.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: MessageStreamParser.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
=cut =cut

View File

@@ -5,36 +5,51 @@ use Carp;
use SOAP::WSDL::TypeLookup; use SOAP::WSDL::TypeLookup;
use base qw(SOAP::WSDL::Expat::Base); use base qw(SOAP::WSDL::Expat::Base);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
#
# Import child elements of a WSDL / XML Schema tree into the current tree
#
# Set the targetNamespace of the imported nodes to $import_namespace
#
# SYNOPSIS
#
# $self->_import_children($name, $imported, $imported, $import_namespace)
#
sub _import_children { sub _import_children {
my ($self, $name, $imported, $importer, $import_namespace) = @_; my ( $self, $name, $imported, $importer, $import_namespace ) = @_;
my $targetNamespace = $importer->get_targetNamespace(); my $targetNamespace = $importer->get_targetNamespace();
my $push_method = "push_$name"; my $push_method = "push_$name";
my $get_method = "get_$name"; my $get_method = "get_$name";
my $default_namespace = $imported->get_xmlns()->{ '#default' }; my $default_namespace = $imported->get_xmlns()->{'#default'};
no strict qw(refs); no strict qw(refs);
my $value_ref = $imported->$get_method(); my $value_ref = $imported->$get_method();
if ($value_ref) { if ($value_ref) {
$value_ref = [ $value_ref ] if (not ref $value_ref eq 'ARRAY'); $value_ref = [$value_ref] if ( not ref $value_ref eq 'ARRAY' );
for ( @{$value_ref} ) {
for (@{ $value_ref }) {
# fixup namespace - new parent may be from different namespace # fixup namespace - new parent may be from different namespace
if (defined ($default_namespace)) { if ( defined($default_namespace) ) {
my $xmlns = $_->get_xmlns(); my $xmlns = $_->get_xmlns();
# it's a hash ref, so we can just update values # it's a hash ref, so we can just update values
if (! defined $xmlns->{ '#default'}) { if ( !defined $xmlns->{'#default'} ) {
$xmlns->{ '#default' } = $default_namespace; $xmlns->{'#default'} = $default_namespace;
} }
} }
# fixup targetNamespace, but don't override # fixup targetNamespace, but don't override
$_->set_targetNamespace( $import_namespace ) $_->set_targetNamespace($import_namespace)
if ( ($import_namespace ne $targetNamespace) && ! $_->get_targetNamespace); if ( ( $import_namespace ne $targetNamespace )
&& !$_->get_targetNamespace );
# update parent... # update parent...
$_->set_parent( $importer ); $_->set_parent($importer);
# push elements into importing WSDL # push elements into importing WSDL
$importer->$push_method($_); $importer->$push_method($_);
@@ -43,242 +58,284 @@ sub _import_children {
} }
sub _import_namespace_definitions { sub _import_namespace_definitions {
my $self = shift; my $self = shift;
my $arg_ref = shift; my $arg_ref = shift;
my $importer = $arg_ref->{ importer }; my $importer = $arg_ref->{importer};
my $imported = $arg_ref->{ imported }; my $imported = $arg_ref->{imported};
# import namespace definitions, too # import namespace definitions, too
my $importer_ns_of = $importer->get_xmlns(); my $importer_ns_of = $importer->get_xmlns();
my %xmlns_of = %{ $imported->get_xmlns() }; my %xmlns_of = %{$imported->get_xmlns()};
# it's a hash ref, we can just add to. # it's a hash ref, we can just add to.
# TODO: check whether prefix is already taken. # TODO: check whether URI is the better key.
# TODO: check wheter URI is the better key. while ( my ( $prefix, $url ) = each %xmlns_of ) {
while (my ($prefix, $url) = each %xmlns_of) { if ( exists( $importer_ns_of->{$prefix} ) ) {
$importer_ns_of->{ $prefix } = $url;
# warn "$prefix already exists";
next;
}
$importer_ns_of->{$prefix} = $url;
} }
} }
sub xml_schema_import { sub xml_schema_import {
my $self = shift; my $self = shift;
my $schema = shift; my $schema = shift;
my $parser = $self->clone(); my $parser = $self->clone();
my %attr_of = @_; my %attr_of = @_;
my $import_namespace = $attr_of{ namespace }; my $import_namespace = $attr_of{namespace};
if (not $attr_of{schemaLocation}) { if ( not $attr_of{schemaLocation} ) {
warn "cannot import document for namespace >$import_namespace< without location"; warn
"cannot import document for namespace >$import_namespace< without location";
return; return;
} }
if (not $self->get_uri) { if ( not $self->get_uri ) {
die "cannot import document from namespace >$import_namespace< without base uri. Use >parse_uri< or >set_uri< to set one." die
"cannot import document from namespace >$import_namespace< without base uri. Use >parse_uri< or >set_uri< to set one.";
} }
my $uri = URI->new_abs($attr_of{schemaLocation}, $self->get_uri() ); my $uri = URI->new_abs( $attr_of{schemaLocation}, $self->get_uri() );
my $imported = $parser->parse_uri($uri); my $imported = $parser->parse_uri($uri);
# might already be imported - parse_uri just returns in this case # might already be imported - parse_uri just returns in this case
return if not defined $imported; return if not defined $imported;
$self->_import_namespace_definitions({ $self->_import_namespace_definitions( {
importer => $schema, importer => $schema,
imported => $imported, imported => $imported,
}); } );
for my $name ( qw(type element group attribute attributeGroup) ) { for my $name (qw(type element group attribute attributeGroup)) {
$self->_import_children( $name, $imported, $schema, $import_namespace); $self->_import_children( $name, $imported, $schema,
$import_namespace );
} }
} }
sub wsdl_import { sub wsdl_import {
my $self = shift; my $self = shift;
my $definitions = shift; my $definitions = shift;
my $parser = $self->clone(); my $parser = $self->clone();
my %attr_of = @_; my %attr_of = @_;
my $import_namespace = $attr_of{ namespace }; my $import_namespace = $attr_of{namespace};
if (not $attr_of{location}) { if ( not $attr_of{location} ) {
warn "cannot import document for namespace >$import_namespace< without location"; warn
"cannot import document for namespace >$import_namespace< without location";
return; return;
} }
if (not $self->get_uri) { if ( not $self->get_uri ) {
die "cannot import document from namespace >$import_namespace< without base uri. Use >parse_uri< or >set_uri< to set one." die
"cannot import document from namespace >$import_namespace< without base uri. Use >parse_uri< or >set_uri< to set one.";
} }
my $uri = URI->new_abs($attr_of{location}, $self->get_uri() ); my $uri = URI->new_abs( $attr_of{location}, $self->get_uri() );
my $imported = $parser->parse_uri($uri); my $imported = $parser->parse_uri($uri);
# might already be imported - parse_uri just returns in this case # might already be imported - parse_uri just returns in this case
return if not defined $imported; return if not defined $imported;
$self->_import_namespace_definitions({ $self->_import_namespace_definitions( {
importer => $definitions, importer => $definitions,
imported => $imported, imported => $imported,
}); } );
for my $name ( qw(types message binding portType service) ) { for my $name (qw(types message binding portType service)) {
$self->_import_children( $name, $imported, $definitions, $import_namespace); $self->_import_children( $name, $imported, $definitions,
$import_namespace );
} }
} }
sub _initialize { sub _initialize {
my ($self, $parser) = @_; my ( $self, $parser ) = @_;
# init object data # init object data
$self->{ parser } = $parser; $self->{parser} = $parser;
delete $self->{ data }; delete $self->{data};
# setup local variables for keeping temp data # setup local variables for keeping temp data
my $characters = undef; my $characters = undef;
my $current = undef; my $current = undef;
my $list = []; # node list my $list = []; # node list
my $elementFormQualified = 1; # default for WSDLs, schema may override
# TODO skip non-XML Schema namespace tags # TODO skip non-XML Schema namespace tags
$parser->setHandlers( $parser->setHandlers(
Start => sub { Start => sub {
my ($parser, $localname, %attrs) = @_;
# handle attrs as list - expat uses dual-vars for looking
# up namespace information, and hash keys don't allow dual vars...
my ( $parser, $localname, @attrs ) = @_;
$characters = q{}; $characters = q{};
my $action = SOAP::WSDL::TypeLookup->lookup( my $action =
$parser->namespace($localname), SOAP::WSDL::TypeLookup->lookup( $parser->namespace($localname),
$localname $localname );
);
return if not $action; return if not $action;
if ($action->{ type } eq 'CLASS') { if ( $action->{type} eq 'CLASS' ) {
eval "require $action->{ class }"; eval "require $action->{ class }";
croak $@ if ($@); croak $@ if ($@);
my $obj = $action->{ class }->new({ parent => $current, my $obj = $action->{class}->new( {
# xmlns => { '#default' => $parser->namespace($localname) } parent => $current,
}) namespace => $parser->namespace($localname),
->init( _fixup_attrs( $parser, %attrs ) ); defined($current)
? ( xmlns => $current->get_xmlns() )
: ()} )->init( _fixup_attrs( $parser, @attrs ) );
if ($current) { if ($current) {
if ( defined $list->[-1]
&& $list->[-1]->isa('SOAP::WSDL::XSD::Schema') ) {
$elementFormQualified =
$list->[-1]->get_elementFormDefault() eq
'qualified';
}
# inherit namespace, but don't override # inherit namespace, but don't override
$obj->set_targetNamespace( $current->get_targetNamespace() ) if ($elementFormQualified) {
if not $obj->get_targetNamespace(); $obj->set_targetNamespace(
$current->get_targetNamespace() )
if not $obj->get_targetNamespace();
}
# push on parent's element/type list # push on parent's element/type list
my $method = "push_$localname"; my $method = "push_$localname";
no strict qw(refs); no strict qw(refs);
$current->$method( $obj ); $current->$method($obj);
# remember element for stepping back # remember element for stepping back
push @{ $list }, $current; push @{$list}, $current;
}
else {
$self->{ data } = $obj;
} }
# set new element (step down) # set new element (step down)
$current = $obj; $current = $obj;
} }
elsif ($action->{ type } eq 'PARENT') { elsif ( $action->{type} eq 'PARENT' ) {
$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 }; my $method = $action->{method};
no strict qw(refs); no strict qw(refs);
# call method with # call method with
# - default value ($action->{ value } if defined, # - default value ($action->{ value } if defined,
# dereferencing lists # dereferencing lists
# - the values of the elements Attributes hash # - the values of the elements Attributes hash
# TODO: add namespaces declared to attributes. # TODO: add namespaces declared to attributes.
# Expat consumes them, so we have to re-add them here. # Expat consumes them, so we have to re-add them here.
$current->$method( defined $action->{ value } $current->$method(
? ref $action->{ value } defined $action->{value}
? @{ $action->{ value } } ? ref $action->{value}
: ($action->{ value }) ? @{$action->{value}}
: _fixup_attrs($parser, %attrs) : ( $action->{value} )
); : _fixup_attrs( $parser, @attrs ) );
} }
elsif ($action->{type} eq 'HANDLER') { elsif ( $action->{type} eq 'HANDLER' ) {
my $method = $self->can($action->{method}); my $method = $self->can( $action->{method} );
$method->($self, $current, %attrs); $method->( $self, $current, @attrs );
} }
else { else {
# TODO replace by hash lookup of known namespaces. # TODO replace by hash lookup of known namespaces.
my $namespace = $parser->namespace($localname) || q{}; my $namespace = $parser->namespace($localname) || q{};
my $part = $namespace eq 'http://schemas.xmlsoap.org/wsdl/' my $part =
? 'WSDL 1.1' $namespace eq 'http://schemas.xmlsoap.org/wsdl/'
: 'XML Schema'; ? 'WSDL 1.1'
: 'XML Schema';
warn "$part element <$localname> is not implemented yet" warn "$part element <$localname> is not implemented yet"
if ($localname !~m{ \A (:? annotation | documentation ) \z }xms ); if ( $localname !~
m{ \A (:? annotation | documentation ) \z }xms );
} }
return; return;
}, },
Char => sub { $characters .= $_[1]; return; }, Char => sub { $characters .= $_[1]; return; },
End => sub { End => sub {
my ($parser, $localname) = @_; my ( $parser, $localname ) = @_;
my $action = SOAP::WSDL::TypeLookup->lookup( my $action =
$parser->namespace( $localname ), SOAP::WSDL::TypeLookup->lookup( $parser->namespace($localname),
$localname $localname )
) || {}; || {};
return if not ($action->{ type }); if ( !defined $list->[-1] ) {
if ( $action->{ type } eq 'CLASS' ) { $self->{data} = $current;
$current = pop @{ $list }; return;
} }
elsif ($action->{ type } eq 'CONTENT' ) {
my $method = $action->{ method };
return if not( $action->{type} );
if ( $action->{type} eq 'CLASS' ) {
$current = pop @{$list};
if ( defined $list->[-1] && $list->[-1]->isa('SOAP::WSDL::XSD::Schema') ) {
$elementFormQualified = 1;
}
}
elsif ( $action->{type} eq 'CONTENT' ) {
my $method = $action->{method};
# normalize whitespace # normalize whitespace
$characters =~s{ ^ \s+ (.+) \s+ $ }{$1}xms; $characters =~ s{ ^ \s+ (.+) \s+ $ }{$1}xms;
$characters =~s{ \s+ }{ }xmsg; $characters =~ s{ \s+ }{ }xmsg;
no strict qw(refs); no strict qw(refs);
$current->$method( $characters ); $current->$method($characters);
} }
return; return;
} } );
);
return $parser; return $parser;
} }
# make attrs SAX style # make attrs SAX style
sub _fixup_attrs { sub _fixup_attrs {
my ($parser, %attrs_of) = @_; my ( $parser, @attrs ) = @_;
my @attrs_from = map { my @attr_key_from = ();
$_ = my @attr_value_from = ();
{
Name => $_, while (@attrs) {
Value => $attrs_of{ $_ }, push @attr_key_from, shift @attrs;
LocalName => $_ push @attr_value_from, shift @attrs;
} }
} keys %attrs_of;
my @attrs_from;
# add xmlns: attrs. expat eats them. # add xmlns: attrs. expat eats them.
push @attrs_from, map { #
# ignore xmlns=FOO namespaces - must be XML schema # add namespaces before attributes: Attributes may be namespace-qualified
# # Other nodes should be ignored somewhere else #
# ($_ eq '#default') push @attrs_from, map { {
# ? () Name => "xmlns:$_",
# : Value => $parser->expand_ns_prefix($_),
{
Name => "xmlns:$_",
Value => $parser->expand_ns_prefix( $_ ),
LocalName => $_ LocalName => $_
} }
} $parser->new_ns_prefixes(); } $parser->new_ns_prefixes();
push @attrs_from, map { {
Name => defined $parser->namespace($_)
? $parser->namespace($_) . '|' . $_
: '|' . $_,
Value => shift @attr_value_from, # $attrs_of{ $_ },
LocalName => $_
}
} @attr_key_from;
return @attrs_from; return @attrs_from;
} }
1; 1;
=pod =pod
=head1 NAME =head1 NAME
@@ -310,11 +367,11 @@ the same terms as perl itself
=head1 Repository information =head1 Repository information
$Id: WSDLParser.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: WSDLParser.pm 851 2009-05-15 22:45:18Z kutterma $
$LastChangedDate: 2008-05-18 22:17:56 +0200 (So, 18 Mai 2008) $ $LastChangedDate: 2009-05-16 00:45:18 +0200 (Sa, 16. Mai 2009) $
$LastChangedRevision: 677 $ $LastChangedRevision: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $

View File

@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Deserializer;
use strict; use strict;
use warnings; use warnings;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %DESERIALIZER = ( my %DESERIALIZER = (
'1.1' => 'SOAP::WSDL::Deserializer::XSD', '1.1' => 'SOAP::WSDL::Deserializer::XSD',

View File

@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Generator;
use strict; use strict;
use warnings; use warnings;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %GENERATOR = ( my %GENERATOR = (
'XSD' => 'SOAP::WSDL::Generator::Template::XSD', 'XSD' => 'SOAP::WSDL::Generator::Template::XSD',

View File

@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Serializer;
use strict; use strict;
use warnings; use warnings;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %SERIALIZER = ( my %SERIALIZER = (
'1.1' => 'SOAP::WSDL::Serializer::XSD', '1.1' => 'SOAP::WSDL::Serializer::XSD',
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Serializer.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: Serializer.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
=cut =cut

View File

@@ -1,7 +1,7 @@
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.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %registered_transport_of = (); my %registered_transport_of = ();
@@ -39,7 +39,7 @@ sub get_transport {
if (defined $registered_transport_of{ $scheme }) { if (defined $registered_transport_of{ $scheme }) {
no strict qw(refs); no strict qw(refs);
defined %{ "$registered_transport_of{ $scheme }::" } or $registered_transport_of{ $scheme }->can('new') or
eval "require $registered_transport_of{ $scheme }" eval "require $registered_transport_of{ $scheme }"
or die "Cannot load transport class $registered_transport_of{ $scheme } : $@"; or die "Cannot load transport class $registered_transport_of{ $scheme } : $@";
@@ -60,11 +60,11 @@ sub get_transport {
no strict qw(refs); no strict qw(refs);
# behaves interestingly different under different versions of perl # behaves interestingly different under different versions of perl
# maybe true even if it's not available # maybe true even if it's not available
defined %{ "$SOAP_LITE_TRANSPORT_OF{ $scheme }::" } my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
$protocol_class->can('new')
or eval "require $SOAP_LITE_TRANSPORT_OF{ $scheme }" or eval "require $SOAP_LITE_TRANSPORT_OF{ $scheme }"
or last SOAP_Lite; or last SOAP_Lite;
my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
# may fail if it's not available # may fail if it's not available
my $transport = eval { $protocol_class->new( %attrs ) } my $transport = eval { $protocol_class->new( %attrs ) }
or last SOAP_Lite; or last SOAP_Lite;
@@ -74,7 +74,7 @@ sub get_transport {
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) { if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
no strict qw(refs); no strict qw(refs);
defined %{ "$SOAP_WSDL_TRANSPORT_OF{ $scheme }::"} $SOAP_WSDL_TRANSPORT_OF{ $scheme }->can('new')
or eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }" or eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }"
or die "Cannot load transport class $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 );
@@ -243,9 +243,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Transport.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: Transport.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
=cut =cut

View File

@@ -2,7 +2,7 @@ package SOAP::WSDL::Generator::Iterator::WSDL11;
use strict; use warnings; use strict; use warnings;
use Class::Std::Fast; use Class::Std::Fast;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %definitions_of :ATTR(:name<definitions> :default<[]>); my %definitions_of :ATTR(:name<definitions> :default<[]>);
my %nodes_of :ATTR(:name<nodes> :default<[]>); my %nodes_of :ATTR(:name<nodes> :default<[]>);
@@ -73,8 +73,10 @@ my %METHOD_OF = (
$node->get_type() $node->get_type()
? do { ? do {
die "unsupported global type <" die "unsupported global type <"
. $node->get_type . "> found in part ". $node->get_name(); . $node->get_type . "> found in part <". $node->get_name() . ">\n"
$types->find_type( $node->expand($node->get_type) ) . "Looks like a rpc/literal WSDL, which is not supported by SOAP::WSDL\n";
## use this once we can auto-generate an element for RPC bindings
# $types->find_type( $node->expand($node->get_type) )
} }
: (), : (),
$node->get_element() $node->get_element()

View File

@@ -3,7 +3,7 @@ use strict; use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_map> :default<{}>); my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_map> :default<{}>);
my %namespace_map_of :ATTR(:name<namespace_map> :default<{}>); my %namespace_map_of :ATTR(:name<namespace_map> :default<{}>);
@@ -128,7 +128,7 @@ You cannot suffix your types by some rule yet...
Copyright 2008 Martin Kutter. Copyright 2008 Martin Kutter.
This library is free software. You may distribute/modify it under This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself the same terms as perl itself
=head1 AUTHOR =head1 AUTHOR

View File

@@ -1,11 +1,11 @@
package SOAP::WSDL::Generator::Template; package SOAP::WSDL::Generator::Template;
use strict; use strict; use warnings;
use Template; use Template 2.18;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use Carp; use Carp;
use SOAP::WSDL::Generator::PrefixResolver; use SOAP::WSDL::Generator::PrefixResolver;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
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<()>);
@@ -39,7 +39,8 @@ sub _process :PROTECTED {
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', PLUGIN_BASE => 'SOAP::WSDL::Generator::Template::Plugin',
); )
or die Template->error();
$tt->process( $template, $tt->process( $template,
{ {
@@ -68,4 +69,40 @@ sub _process :PROTECTED {
or croak $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error(); or croak $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error();
} }
1; 1;
=pod
=head1 NAME
SOAP::WSDL::Generator::Template - Template-based code generator
=head1 DESCRIPTION
SOAP::WSDL's template based code generator
Base class for writing template based generators
=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 2008, 2009 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 770 2009-01-24 22:55:54Z kutterma $
$LastChangedDate: 2009-01-24 23:55:54 +0100 (Sa, 24 Jan 2009) $
$LastChangedRevision: 770 $
$LastChangedBy: kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $

View File

@@ -3,8 +3,8 @@ use strict;
use warnings; use warnings;
use Carp qw(confess); use Carp qw(confess);
use Class::Std::Fast::Storable constructor => 'none'; use Class::Std::Fast::Storable constructor => 'none';
use Scalar::Util qw(blessed);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_map> :default<{}>); my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_map> :default<{}>);
my %namespace_map_of :ATTR(:name<namespace_map> :default<{}>); my %namespace_map_of :ATTR(:name<namespace_map> :default<{}>);
@@ -129,8 +129,10 @@ sub create_subpackage_name {
my $type = ref $arg_ref eq 'HASH' ? $arg_ref->{ value } : $arg_ref; my $type = ref $arg_ref eq 'HASH' ? $arg_ref->{ value } : $arg_ref;
my @name_from = $type->get_name() || (); ; my @name_from = $type->get_name() || (); ;
my $parent = $type;
my $top_node = $parent; # search for top node in tree (the one directly below the Schema)
my $parent = $type;
my $top_node = $parent;
if (! $parent->get_parent()->isa('SOAP::WSDL::XSD::Schema') ) { if (! $parent->get_parent()->isa('SOAP::WSDL::XSD::Schema') ) {
NAMES: while ($parent = $parent->get_parent()) { NAMES: while ($parent = $parent->get_parent()) {
$top_node = $parent; $top_node = $parent;
@@ -141,9 +143,13 @@ sub create_subpackage_name {
} }
} }
# create name for top node # create name for top node
die "FOO" if not defined $top_node; die "No top node found" if not defined $top_node;
my $top_node_name = $self->create_xsd_name($top_node); my $top_node_name = $self->create_xsd_name($top_node);
my $package_name = join('::_', $top_node_name , (@name_from) ? join('::', @name_from) : () ); my $package_name = join('::_', $top_node_name , (@name_from) ? join('::', @name_from) : () );
# replace dots by :: in name - subpackage names may include dots, too
$package_name =~s{\.}{::}xg;
return $package_name; return $package_name;
} }
@@ -155,6 +161,8 @@ sub element_name {
my $self = shift; my $self = shift;
my $element = shift; my $element = shift;
confess "no element object" unless blessed $element;
my $name = $element->get_name(); my $name = $element->get_name();
if (! $name) { if (! $name) {
while (my $ref = $element->get_ref()) { while (my $ref = $element->get_ref()) {

View File

@@ -1,19 +1,19 @@
package SOAP::WSDL::Generator::Template::XSD; package SOAP::WSDL::Generator::Template::XSD;
use strict; use strict; use warnings;
use Template; use Template 2.18;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use File::Basename; use File::Basename;
use File::Spec; use File::Spec;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
use SOAP::WSDL::Generator::Visitor::Typemap; use SOAP::WSDL::Generator::Visitor::Typemap;
use SOAP::WSDL::Generator::Visitor::Typelib;
use SOAP::WSDL::Generator::Template::Plugin::XSD; 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<({})>);
my %silent_of :ATTR(:name<silent> :default<0>);
sub BUILD { sub BUILD {
my ($self, $ident, $arg_ref) = @_; my ($self, $ident, $arg_ref) = @_;
@@ -113,7 +113,8 @@ sub _generate_interface {
$service, $service,
$port, $port,
)); ));
print "Creating interface class $output\n"; print "Creating interface class $output\n"
if not $silent_of{ident $self};
$self->_process($template_name, $self->_process($template_name,
{ {
@@ -173,7 +174,8 @@ sub generate_typemap {
my $output = $arg_ref->{ output } my $output = $arg_ref->{ output }
? $arg_ref->{ output } ? $arg_ref->{ output }
: $self->_generate_filename( $self->get_name_resolver()->create_typemap_name($service) ); : $self->_generate_filename( $self->get_name_resolver()->create_typemap_name($service) );
print "Creating typemap class $output\n"; print "Creating typemap class $output\n"
if not $silent_of{ident $self};
$self->_process('Typemap.tt', $self->_process('Typemap.tt',
{ {
service => $service, service => $service,
@@ -205,6 +207,8 @@ sub visit_XSD_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_name_resolver()->create_xsd_name($element) ); : $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($element) );
warn "Creating element class $output \n"
if not $silent_of{ ident $self};
$self->_process('element.tt', { element => $element } , $output); $self->_process('element.tt', { element => $element } , $output);
} }
@@ -213,6 +217,8 @@ sub visit_XSD_SimpleType {
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_name_resolver()->create_xsd_name($type) ); : $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($type) );
warn "Creating simpleType class $output \n"
if not $silent_of{ ident $self};
$self->_process('simpleType.tt', { simpleType => $type } , $output); $self->_process('simpleType.tt', { simpleType => $type } , $output);
} }
@@ -221,7 +227,111 @@ sub visit_XSD_ComplexType {
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_name_resolver()->create_xsd_name($type) ); : $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($type) );
warn "Creating complexType class $output \n"
if not $silent_of{ ident $self};
$self->_process('complexType.tt', { complexType => $type } , $output); $self->_process('complexType.tt', { complexType => $type } , $output);
} }
1; 1;
=pod
=head1 NAME
SOAP::WSDL::Generator::Template::XSD - XSD code generator
=head1 DESCRIPTION
SOAP::WSDL's XSD code generator
=head1 SYNOPSIS
See L<wsdl2perl.pl|wsdl2perl.pl> for an example on how to use this class.
=head1 METHODS
=head2 new
Constructor.
Options (Options can also be set via set_OPTION methods):
=over
=item * silent
Suppress warnings about what's being generated
=back
=head2 generate
Shortcut for calling L<generate_typelib> and L<generate_client>
=head2 generate_client
Generates a client interface
=head2 generate_server
Generates a server class
=head2 generate_typelib
Generates type and element classes
=head2 generate_typemap
Generate a typemap class required by SOAP::WSDL's MessageParser
=head2 generate_interface
(Deprecated) alias for generate_client
=head2 get_name_resolver
Returns a name resolver template plugin
=head2 visit_XSD_Attribute
Visitor method for SOAP::WSDL::XSD::Attribute. Should be factored out into
visitor class.
=head2 visit_XSD_ComplexType
Visitor method for SOAP::WSDL::XSD::ComplexType. Should be factored out into
visitor class.
=head2 visit_XSD_Element
Visitor method for SOAP::WSDL::XSD::Element. Should be factored out into
visitor class.
=head2 visit_XSD_SimpleType
Visitor method for SOAP::WSDL::XSD::SimpleType. Should be factored out into
visitor 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 2008, 2009 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 770 2009-01-24 22:55:54Z kutterma $
$LastChangedDate: 2009-01-24 23:55:54 +0100 (Sa, 24 Jan 2009) $
$LastChangedRevision: 770 $
$LastChangedBy: kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $

View File

@@ -4,6 +4,16 @@
[% 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 %] ); # for now we only document the first response part - document/literal
# doesn't allow more.
response_name = port_op.first_output.get_message();
response_part = definitions.find_message( port_op.first_output.expand( response_name ) ).get_part();
response_body_element = definitions.first_types.find_element( response_part.0.expand( response_part.0.get_element ) );
response_body_class = XSD.create_xsd_name(response_body_element);
%]
Returns a L<[% response_body_class %]|[% response_body_class %]> object.
$response = $interface->[% operation.get_name %]([% INCLUDE Interface/POD/Message.tt %] );

View File

@@ -7,7 +7,6 @@ our [% USE Dumper(varname = 'typemap_'); Dumper.dump( typemap ) %];
sub get_class { sub get_class {
my $name = join '/', @{ $_[1] }; my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name }; return $typemap_1->{ $name };
} }

View File

@@ -1,4 +1,5 @@
[% USE XSD -%] [% USE XSD;
USE Dumper -%]
package [% XSD.create_xsd_name(complexType) %]; package [% XSD.create_xsd_name(complexType) %];
use strict; use strict;
use warnings; use warnings;
@@ -8,6 +9,12 @@ use warnings;
# may be sub-packages... # may be sub-packages...
#-%] #-%]
__PACKAGE__->_set_element_form_qualified([%-
IF complexType.schema.get_elementFormDefault == 'qualified'
-%]1[% ELSE %]0[% END %]);
sub get_xmlns { '[% complexType.get_targetNamespace %]' };
[% INCLUDE complexType/contentModel.tt %] [% INCLUDE complexType/contentModel.tt %]
1; 1;

View File

@@ -1,12 +1,12 @@
[% IF (complexType.get_variety == 'restriction'); [% IF (complexType.get_derivation == 'restriction');
INCLUDE complexType/POD/restriction.tt(complexType = complexType); INCLUDE complexType/POD/restriction.tt(complexType = complexType);
ELSIF (complexType.get_variety == 'extension'); ELSIF (complexType.get_derivation == 'extension');
#THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet"; #THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet";
%] %]
# No documentation generated for complexContent / extension yet # No documentation generated for complexContent / extension yet
[% [%
ELSE; ELSE;
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }"; THROW UNKNOWN, "unknown derivation ${ complexType.get_derivation }";
END; END;
%] %]

View File

@@ -30,14 +30,17 @@ __PACKAGE__->_factory(
{ {
[% FOREACH element = complexType.get_element; [% FOREACH element = complexType.get_element;
IF (ref = element.get_ref); IF (ref = element.get_ref);
element = definitions.first_types.find_element(element.expand( element.get_ref )); ref_element = definitions.first_types.find_element(element.expand( ref ));
END; -%]
IF (type = element.get_type); '[% XSD.perl_var_name(XSD.element_name(ref_element)) %]' => '[% XSD.create_xsd_name(ref_element) %]',
[% ELSIF (type = element.get_type);
element_type = definitions.first_types.find_type(complexType.expand( type )); element_type = definitions.first_types.find_type(complexType.expand( type ));
IF (! element_type); IF (! element_type);
type_name = complexType.expand( type ); type_name = complexType.expand( type );
THROW NOT_FOUND, "${ type_name.0 } ${ type_name.1 } not found"; THROW NOT_FOUND, "${ type_name.0 } ${ type_name.1 } not found";
END; -%] END;
-%]
'[% XSD.perl_var_name(XSD.element_name(element)) %]' => '[% XSD.create_xsd_name(element_type) %]', '[% XSD.perl_var_name(XSD.element_name(element)) %]' => '[% XSD.create_xsd_name(element_type) %]',
[% ELSE; [% ELSE;
IF (element.first_simpleType); IF (element.first_simpleType);

View File

@@ -7,6 +7,10 @@ ELSIF (complexType.get_variety == 'sequence');
ELSIF (complexType.get_variety == 'all'); ELSIF (complexType.get_variety == 'all');
INCLUDE complexType/extension.tt(complexType = complexType); INCLUDE complexType/extension.tt(complexType = complexType);
ELSE; ELSE;
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }"; IF (complexType.get_variety);
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
ELSE -%]
# empty variety
[% END;
END; END;
%] %]

View File

@@ -22,7 +22,7 @@ element_list = [];
# copy complexType ref # copy complexType ref
base_type = complexType; base_type = complexType;
base_name=base_type.expand( base_type.get_base ); base_name = base_type.expand( base_type.get_base );
base_type = definitions.first_types.find_type( base_name ); base_type = definitions.first_types.find_type( base_name );
# add a use base for first to setup inheritance # add a use base for first to setup inheritance
@@ -31,13 +31,17 @@ use base qw([% XSD.create_xsd_name( base_type ) %]);
[% [%
# loop forever # loop forever
WHILE (1); WHILE (1);
IF (complexType.get_variety == 'extension');
# wrap statement in IF to avoid printing
IF (complexType.set_variety( base_type.get_variety )); END;
END;
# make a copy. We don't want to modify the original list here... # make a copy. We don't want to modify the original list here...
FOREACH element = base_type.get_element.reverse; FOREACH element = base_type.get_element.reverse;
element_list.unshift(element); element_list.unshift(element);
END; END;
# get next base type if there is one...
# get next base type IF (base_type.get_base);
IF (base_name=base_type.expand( base_type.get_base )); base_name=base_type.expand( base_type.get_base );
# set new base_type # set new base_type
base_type = definitions.first_types.find_type( base_name ); base_type = definitions.first_types.find_type( base_name );
ELSE; ELSE;
@@ -59,8 +63,11 @@ END;
# set derived element list # set derived element list
# wrap in IF; END; to prevent it getting printed # wrap in IF; END; to prevent it getting printed
IF (complexType.set_element( element_list )); END; IF ( complexType.set_element( element_list ) ); END;
-%]
# Variety: [% complexType.get_variety %]
[%
INCLUDE complexType/variety.tt(complexType = complexType); INCLUDE complexType/variety.tt(complexType = complexType);
# restore original element list # restore original element list

View File

@@ -76,6 +76,38 @@ Perl data type class for the XML Schema defined element
[% INCLUDE POD/annotation.tt(node = element) %] [% INCLUDE POD/annotation.tt(node = element) %]
[% IF (complexType = element.first_complexType);
IF (complexType.get_element); %]
[% head1 %] PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
=over
[% FOREACH child_element = complexType.get_element -%]
=item * [% XSD.perl_var_name(XSD.element_name(child_element)) %]
$element->set_[% XSD.perl_var_name(XSD.element_name(child_element)) %]($data);
$element->get_[% XSD.perl_var_name(XSD.element_name(child_element)) %]();
[% IF (XSD.perl_var_name(XSD.element_name(child_element)) == child_element.get_name); %]
[% ELSE %]
Note: The name of this property has been altered, because it didn't match
perl's notion of variable/subroutine names. The altered name is used in
perl code only, XML output uses the original name:
[% child_element.get_name %]
[% END %]
[% END; %]
=back
[% END;
END; -%]
[% head1 %] METHODS [% head1 %] METHODS
[% head2 %] new [% head2 %] new

View File

@@ -4,11 +4,11 @@ use base qw(
[% [%
base_type = definitions.get_types.0.find_type(simpleType.expand(base)); base_type = definitions.get_types.0.find_type(simpleType.expand(base));
IF ! base_type; IF ! base_type;
THROW NOT_FOUND "No base type in " _ simpleType.get_parent.get_name; THROW NOT_FOUND "base type $base not found." _ simpleType.get_parent.get_name;
END; END;
XSD.create_xsd_name(base_type) %]); XSD.create_xsd_name(base_type) %]);
[% ELSIF (type = simpleType.first_simpleType() ); [% ELSIF (type = simpleType.first_simpleType() );
INCLUDE simpleType/atomicType.tt(type = type); INCLUDE simpleType/atomicType.tt(type = type);
ELSE; ELSE;
THROW "neither base nor atomic type - don't know what to do" %] THROW "neither base nor atomic type - don't know what to do" %]
[% END %] [% END %]

View File

@@ -3,7 +3,7 @@ use strict;
use warnings; use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %definitions_of :ATTR(:name<definitions> :default<()>); my %definitions_of :ATTR(:name<definitions> :default<()>);
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>); my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);

View File

@@ -1,11 +0,0 @@
package SOAP::WSDL::Generator::Visitor::Typelib;
use strict;
use warnings;
use base qw(SOAP::WSDL::Generator::Visitor
SOAP::WSDL::Generator::Template
);
use version; our $VERSION = qv('2.00.03');
1;

View File

@@ -5,7 +5,7 @@ use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Generator::Visitor); use base qw(SOAP::WSDL::Generator::Visitor);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %path_of :ATTR(:name<path> :default<[]>); my %path_of :ATTR(:name<path> :default<[]>);
my %typemap_of :ATTR(:name<typemap> :default<()>); my %typemap_of :ATTR(:name<typemap> :default<()>);
@@ -182,3 +182,39 @@ sub visit_XSD_ComplexType {
} }
1; 1;
__END__
=pod
=head1 NAME
SOAP::WSDL::Generator::Visitor::Typemap - Visitor class for generating typemaps
=head1 DESCRIPTION
Visitor used by SOAP::WSDL's XSD generator for creating typemaps
=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 2008, 2009 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 770 2009-01-24 22:55:54Z kutterma $
$LastChangedDate: 2009-01-24 23:55:54 +0100 (Sa, 24 Jan 2009) $
$LastChangedRevision: 770 $
$LastChangedBy: kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $

View File

@@ -58,8 +58,7 @@ typemaps. For every Web service, there's also a typemap created.
=head2 Interface class creation =head2 Interface class creation
To create interface classes, follow the steps above from To create interface classes, follow the steps above.
L<Quick walk-through for the unpatient|Quick walk-through for the unpatient>.
If this works fine for you, skip the next paragraphs. If not, read on. If this works fine for you, skip the next paragraphs. If not, read on.

View File

@@ -0,0 +1,91 @@
=pod
=head1 Writing Code-First Web Services with SOAP::WSDL
B<Note: This document is just a collection of thought. There's no implementation yet>.
=head2 How Data Class definitions could look like
=head3 Moose
Of course SOAP::WSDL could (and probably should) just use Moose - it provides the full
Metaclass Framework needed for generating Schemas from class definitions.
However, Moose is way too powerful for building (just) simple Data Transfer Objects which
can be expressed in XML.
With Moose, a class could look like this:
package MyElements::GenerateBarCode;
use Moose;
has 'xmlns' =>
is => 'ro',
default => 'http://webservicex.net';
has 'xmlname' =>
is => 'ro',
default => 'GenerateBarCode';
has 'BarCodeParam' =>
is => 'rw',
type => 'MyTypes::BarCodeData';
has 'BarCodeText' =>
is => 'rw',
type => 'String';
1;
This is - despite the condensed syntax - a lot of line noise.
=head3 Native SOAP::WSDL
SOAP::WSDL::XSD::Typelib::ComplexType (should) provide a simple setup method allowing a even shorter
description (and offering the additional performance boost SOAP::WSDL has over Moose):
package MyElements::GenerateBarCode;
use strice; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
use SOAP::WSDL::XSD::Typelib::ComplexType;
_namespace 'http://webservicex.net'; # might be better in the SOAP server interface
_name 'GenerateBarCode';
_elements
BarCodeParam => 'MyTypes::BarCodeData',
BarCodeText => 'string';
This would result in the following XML Schema (inside a schema with the namespace
"http://webservicex.net" - the namespaces could even be declared outside the DTO classes.
<complexType name="GenerateBarCode">
<sequence>
<element name="BarCodeParam" type="tns:BarCodeData"/>
<element name="BarCodeText" type="xsd:string"/>
</sequence>
</complexType>
=head2 Interface definitions
Perl does not have the concept of interfaces. However, Moose provides Roles, which can be used for defining
interfaces.
However, it's not really necessary to define a interface Interface (in the sense of a Jave interface) -
a interface class is sufficient.
Subroutine attributes could be used for providing additional information - attributes in perl are much like
annotations in Java
A interface could look like this:
package MyServer::BarCode;
use strict; use warnings;
use SOAP::WSDL::Server::CodeFirst;
sub generateBarCode :WebMethod(name=<GenerateBarCode>
return=<MyElements::GenerateBarcodeResponse>
body=<MyElements::GenerateBarcode>) {
my ($self, $body, $header) = @_;
my $result = MyElements::GenerateBarcodeResponse->new();
return $result;
};
1;

View File

@@ -12,7 +12,7 @@ You need Crypt::SSLeay installed to access HTTPS webservices.
Passing a username and password, or a client certificate and key, to the Passing a username and password, or a client certificate and key, to the
transport layer is highly dependent on the transport backend. The descriptions transport layer is highly dependent on the transport backend. The descriptions
below are for HTTP(S) transport usingLWP::UserAgent below are for HTTP(S) transport using LWP::UserAgent
=head3 Accessing HTTP(S) webservices with basic/digest authentication =head3 Accessing HTTP(S) webservices with basic/digest authentication
@@ -32,6 +32,28 @@ this backend:
=head3 Accessing HTTP(S) webservices protected by NTLM authentication =head3 Accessing HTTP(S) webservices protected by NTLM authentication
If you want to connect to a windows server using some Windows Domain Login, please
consider using Kerberos instead of the (older) NTLM mechanism - see below.
Kerberos and NTLM are (currently) mutually exclusive - when LWP::Authen::Negotiate
is installed, it will always be queried (and will always raise an error), even
if you don't want to use it. See http://rt.cpan.org/Public/Bug/Display.html?id=32826
for details.
You need the L<NTLM|NTLM> distribution installed to access webservices protected
by NTLM authentication. More specifically, you need the Authen::NTLM module
from this distribution. Note that this is different from the Authen::NTML
distribution by Yee Man Chan also available from CPAN.
Your user credentials usually need to include the windows domain or the
windows hostname like this:
testdomain\testuser
or
\\testhost\testuser
Besides passing user credentials as when accessing a web service protected Besides passing user credentials as when accessing a web service protected
by basic or digest authentication, you also need to enforce connection by basic or digest authentication, you also need to enforce connection
keep_alive on the transport backens. keep_alive on the transport backens.
@@ -47,6 +69,57 @@ You may, of course, decide to just hack the generated class. Be advised that
subclassing might be a more appropriate solution - re-generating overwrites subclassing might be a more appropriate solution - re-generating overwrites
changes in interface classes. changes in interface classes.
=head3 Accessing HTTP(S) webservices protected by NTLMv2
There are different variants of NTLM, and by default Authen::NTLM uses the v1 variant.
NTLM is a connection-based handshake authentication protocol, which requires
three or more requests on the same connection:
Request POST
Response 401 Unauthorized
WWW-Authenticate: NTLM
Request Authorization: NTLM <base64-encoded type-1-message>
Response 401 Unauthorized
WWW-Authenticate: NTLM <base64-encoded type-2-message>
Request Authorization: NTLM <base64-encoded type-3-message>
Response 200 Ok
If you try to access a NTLMv2 protected web service and switch on LWP::Debug by
saying
use LWP::Debug qw(+);
you should see at least two lines containing something like
Authorization NTLM TlRMTVNTUAABAAAAB7IAAAAAAAAAAAAAAwADACAAAABmb28=
...
Authorization NTLM TlRMTVNTUAABAAAAB7IAAAAAAAAAAAAAAw ... much longer ... ADACAAAABmb28=
If you're talking to a Server using NTLMv2 exclusively, you will only the first line
in the debug output, and then an error.
To explicitely enable NTLMv2, do the following in your client:
use Authen::NTLM;
ntlmv2(1);
This globally enables the use of NTLMv2. Note that this is a global setting: All
clients running in the same perl interpreter will be affected. This can
cause unexpected issues when running under mod_perl.
=head3 Accessing webservices protected by HTTP Kerberos Authentication
Use the L<LWP::Authen::Negotiate|LWP::Authen::Negotiate> plugin from CPAN. You
need to set up GSSAPI to perform the Kerberos authentication, though. How to do
this is implementation specific (MIT or Heimdahl). See your Kerberos/GSSAPI
documentation for details.
(Newer) Windows Web Services usually allow to use both the Negotiate (Kerberos)
and NTLM authentication scheme.
=head3 Accessing HTTPS webservices protected by certificate authentication =head3 Accessing HTTPS webservices protected by certificate authentication
You need Crypt::SSLeay installed to access HTTPS webservices. You need Crypt::SSLeay installed to access HTTPS webservices.
@@ -112,12 +185,82 @@ or nil elements):
return "<$prefix:$name>"; return "<$prefix:$name>";
} }
=head1 Skipping unknown XML elements - "lax" XML processing
SOAP::WSDL's default serializer
L<SOAP::WSDL::Deserializer::XSD|SOAP::WSDL::Deserializer::XSD> is a "strict"
XML processor in the sense that it throws an exception on encountering unknown
XML elements.
L<SOAP::WSDL::Deserializer::XSD|SOAP::WSDL::Deserializer::XSD> allows
switching off the stric XML processing by passing the C<strict =E<gt> 0>
option.
=head2 Disabling strict XML processing in a Client
Pass the following as C<deserializer_args>:
{ strict => 0 }
Example: The generated SOAP client is assumed to be "MyInterface::Test".
use MyInterface::Test;
my $soap = MyInterface::Test->new({
deserializer_args => { strict => 0 }
});
my $result = $soap->SomeMethod();
=head2 Disabling strict XML processing in a CGI based server
You have to set the deserializer in the transport class explicitely to
a L<SOAP::WSDL::Deserializer|SOAP::WSDL::Deserializer> object with the
C<strict> option set to 0.
Example: The generated SOAP server is assumed to be "MyServer::Test".
use strict;
use MyServer::Test;
use SOAP::WSDL::Deserializer::XSD;
my $soap = MyServer::Test->new({
transport_class => 'SOAP::WSDL::Server::CGI',
dispatch_to => 'main',
});
$soap->get_transport()->set_deserializer(
SOAP::WSDL::Deserializer::XSD->new({ strict => 0 })
);
$soap->handle();
=head2 Disabling strict XML processing in a mod_perl based server
Sorry, this is not implemented yet - you'll have to write your own handler
class based on L<SOAP::WSDL::Server::Mod_Perl2|SOAP::WSDL::Server::Mod_Perl2>.
=head1 Changing the encoding of a SOAP request
SOAP::WSDL uses utf-8 per default: utf-8
is the de-facto standard for webservice ommunication.
However, you can change the encoding the transport layer announces by calling
C<set_encoding($encoding)> on a client object.
You probably have to write your own serializer class too, because the default
serializer has the utf-8 encoding hardcoded in the envelope.
Just look into SOAP::WSDL::Serializer on how to do that.
Don't forget to register your serializer at the serializer factory
SOAP::WSDL::Factory::Serializer.
=head1 LICENSE AND COPYRIGHT =head1 LICENSE AND COPYRIGHT
Copyright 2008 Martin Kutter. Copyright 2008, 2009 Martin Kutter.
This library is free software. You may distribute/modify it under This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself the same terms as perl itself.
=head1 AUTHOR =head1 AUTHOR
@@ -130,4 +273,4 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
$Id: $ $Id: $
$HeadURL: $ $HeadURL: $
=cut =cut

View File

@@ -93,7 +93,7 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
$Rev: 391 $ $Rev: 391 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Glossary.pod 391 2007-11-17 21:56:13Z kutterma $ $Id: Glossary.pod 391 2007-11-17 21:56:13Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Glossary.pod $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Glossary.pod $
=cut =cut

View File

@@ -241,7 +241,7 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
$Rev: 391 $ $Rev: 391 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Parser.pod 391 2007-11-17 21:56:13Z kutterma $ $Id: Parser.pod 391 2007-11-17 21:56:13Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Parser.pod $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Parser.pod $
=cut =cut

View File

@@ -1255,7 +1255,7 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
$Rev: 562 $ $Rev: 562 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: WS_I.pod 562 2008-02-22 20:32:17Z kutterma $ $Id: WS_I.pod 562 2008-02-22 20:32:17Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $
=cut =cut

View File

@@ -90,10 +90,8 @@ can just say
Of course this will only work if MyTypes::NewType has a superset of the old Of course this will only work if MyTypes::NewType has a superset of the old
object class' elements. object class' elements.
.
Future versions will restrict the data returned to the child element's data - Note that XML attribute data is not included in the hash ref output yet.
you should not expect XML attributes to be returned through hash refs.
=head1 HOW IT WORKS =head1 HOW IT WORKS
@@ -405,7 +403,7 @@ supported (yet).
=item * import =item * import
The import includion element requires the schemaLocation attribute for The import inclusion element requires the schemaLocation attribute for
resolving the XML schema to import. Support for the import element is resolving the XML schema to import. Support for the import element is
implemented in L<SOAP::WSDL::Expat::WSDLParser|SOAP::WSDL::Expat::WSDLParser>, implemented in L<SOAP::WSDL::Expat::WSDLParser|SOAP::WSDL::Expat::WSDLParser>,
so alternative parsers may or may not support the import element. so alternative parsers may or may not support the import element.

View File

@@ -4,7 +4,7 @@ use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %part_of :ATTR(:name<part> :default<[]>); my %part_of :ATTR(:name<part> :default<[]>);

View File

@@ -4,7 +4,7 @@ use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %body_of :ATTR(:name<body> :default<[]>); my %body_of :ATTR(:name<body> :default<[]>);
my %header_of :ATTR(:name<header> :default<[]>); my %header_of :ATTR(:name<header> :default<[]>);

View File

@@ -4,7 +4,7 @@ use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %operation_of :ATTR(:name<operation> :default<()>); my %operation_of :ATTR(:name<operation> :default<()>);
my %input_of :ATTR(:name<input> :default<[]>); my %input_of :ATTR(:name<input> :default<[]>);

View File

@@ -6,7 +6,7 @@ use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %element_of :ATTR(:name<element> :default<()>); my %element_of :ATTR(:name<element> :default<()>);
my %type_of :ATTR(:name<type> :default<()>); my %type_of :ATTR(:name<type> :default<()>);

View File

@@ -4,7 +4,7 @@ use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %binding_of :ATTR(:name<binding> :default<()>); my %binding_of :ATTR(:name<binding> :default<()>);
my %address_of :ATTR(:name<address> :default<()>); my %address_of :ATTR(:name<address> :default<()>);

View File

@@ -2,33 +2,26 @@ package SOAP::WSDL::PortType;
use strict; use strict;
use warnings; use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use List::Util;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %operation_of :ATTR(:name<operation> :default<()>); my %operation_of :ATTR(:name<operation> :default<()>);
my %attributes_of :ATTR(); #
#=head2 find_operation
#
#$port_type->find_operation($namespace, $name)
#
#Returns the PortType's operation object matching the given namespace and
#name
#
%attributes_of = ( sub find_operation {
operation => \%operation_of, return List::Util::first {
); ( $_->get_targetNamespace() eq $_[1] ) && ( $_->get_name() eq $_[2] )
} @{ $operation_of{ ${ $_[0] } } };
# Function factory - we could be writing this method for all %attribute };
# keys, too, but that's just C&P (eehm, Copy & Paste...)
foreach my $method(keys %attributes_of ) {
no strict qw(refs); ## no critic ProhibitNoStrict
# ... btw, we mean this method here...
*{ "find_$method" } = sub {
my ($self, @args) = @_;
my @found_at = grep {
$_->get_targetNamespace() eq $args[0] &&
$_->get_name() eq $args[1]
}
@{ $attributes_of{ $method }->{ ident $self } };
return $found_at[0];
};
}
1; 1;

View File

@@ -4,7 +4,7 @@ use warnings;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %location :ATTR(:name<location> :default<()>); my %location :ATTR(:name<location> :default<()>);
1; 1;

View File

@@ -4,7 +4,7 @@ use warnings;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %use_of :ATTR(:name<use> :default<q{}>); my %use_of :ATTR(:name<use> :default<q{}>);
my %namespace_of :ATTR(:name<namespace> :default<q{}>); my %namespace_of :ATTR(:name<namespace> :default<q{}>);

View File

@@ -4,7 +4,7 @@ use warnings;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %use_of :ATTR(:name<use> :default<q{}>); my %use_of :ATTR(:name<use> :default<q{}>);
my %namespace_of :ATTR(:name<namespace> :default<q{}>); my %namespace_of :ATTR(:name<namespace> :default<q{}>);

View File

@@ -3,6 +3,6 @@ use strict;
use warnings; use warnings;
use base qw(SOAP::WSDL::Header); use base qw(SOAP::WSDL::Header);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
1; 1;

View File

@@ -4,7 +4,7 @@ use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %style_of :ATTR(:name<style> :default<()>); my %style_of :ATTR(:name<style> :default<()>);
my %soapAction_of :ATTR(:name<soapAction> :default<()>); my %soapAction_of :ATTR(:name<soapAction> :default<()>);

View File

@@ -0,0 +1,8 @@
package SOAP::WSDL::SOAP::Typelib::Fault;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
our $VERSION = $SOAP::WSDL::VERSION;
1;

View File

@@ -1,51 +1,102 @@
package SOAP::WSDL::SOAP::Typelib::Fault11; package SOAP::WSDL::SOAP::Typelib::Fault11;
use strict; {
use warnings; use strict;
use Class::Std::Fast::Storable constructor => 'none'; use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
use SOAP::WSDL::XSD::Typelib::ComplexType; use Scalar::Util qw(blessed);
use SOAP::WSDL::XSD::Typelib::Element;
use base qw( use SOAP::WSDL::XSD::Typelib::ComplexType;
SOAP::WSDL::XSD::Typelib::Element use SOAP::WSDL::XSD::Typelib::Element;
SOAP::WSDL::XSD::Typelib::ComplexType
);
my %faultcode_of :ATTR(:get<faultcode>); use base qw(
my %faultstring_of :ATTR(:get<faultstring>); SOAP::WSDL::SOAP::Typelib::Fault
my %faultactor_of :ATTR(:get<faultactor>); SOAP::WSDL::XSD::Typelib::Element
my %detail_of :ATTR(:get<detail>); SOAP::WSDL::XSD::Typelib::ComplexType
);
__PACKAGE__->_factory( my %faultcode_of : ATTR(:get<faultcode>);
[ qw(faultcode faultstring faultactor detail) ], my %faultstring_of : ATTR(:get<faultstring>);
{ my %faultactor_of : ATTR(:get<faultactor>);
faultcode => \%faultcode_of, my %detail_of : ATTR(:get<detail>);
faultstring => \%faultstring_of,
faultactor => \%faultactor_of, __PACKAGE__->_factory(
detail => \%detail_of, [qw(faultcode faultstring faultactor detail)],
}, {
{ faultcode => \%faultcode_of,
faultcode => 'SOAP::WSDL::XSD::Typelib::Builtin::QName', faultstring => \%faultstring_of,
faultstring => 'SOAP::WSDL::XSD::Typelib::Builtin::string', faultactor => \%faultactor_of,
faultactor => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI', detail => \%detail_of,
detail => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType', },
{
faultcode => 'SOAP::WSDL::XSD::Typelib::Builtin::QName',
faultstring => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
faultactor => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
detail => 'SOAP::WSDL::SOAP::Typelib::Fault11Detail',
} );
sub get_xmlns { return 'http://schemas.xmlsoap.org/soap/envelope/' }
__PACKAGE__->__set_name('Fault');
__PACKAGE__->__set_nillable(0);
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref('');
# always return false in boolean context - a fault is never true...
sub as_bool : BOOLIFY {
return;
} }
);
sub get_xmlns { return 'http://schemas.xmlsoap.org/soap/envelope/' }; # override set_detail to allow "auto-vivification" of a details object
# must be implemented via symbol table operation - _factory adds
# methods via symbol table, too.
__PACKAGE__->__set_name('Fault'); # BLOCK to scope warnings
__PACKAGE__->__set_nillable(); {
__PACKAGE__->__set_minOccurs(); no warnings qw(redefine);
__PACKAGE__->__set_maxOccurs(); my $set_detail_sub = \&set_detail;
__PACKAGE__->__set_ref(''); *set_detail = sub {
my ( $self, $detail ) = @_;
# always return false in boolean context - a fault is never true... # create SOAP::WSDL::SOAP::Typelib::Fault11Detail wrapper if there
sub as_bool : BOOLIFY { return; } # is none
if ( not blessed $detail
or
not $detail->isa('SOAP::WSDL::SOAP::Typelib::Fault11Detail') )
{
$detail = SOAP::WSDL::SOAP::Typelib::Fault11Detail->new(
{value => $detail} );
}
# call original method
$set_detail_sub->( $self, $detail );
};
}
Class::Std::initialize();
}
package SOAP::WSDL::SOAP::Typelib::Fault11Detail;
{
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType
);
sub get_xmlns { return 'http://schemas.xmlsoap.org/soap/envelope/' }
__PACKAGE__->__set_name('Fault');
__PACKAGE__->__set_nillable(0);
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
Class::Std::initialize();
}
Class::Std::initialize();
1; 1;
=pod =pod
@@ -88,6 +139,16 @@ Getter/setter for object's faultactor property.
Getter/setter for detail object's detail property. Getter/setter for detail object's detail property.
The detail element is a SOAP::WSDL::SOAP::Typelib::Fault11Detail object.
This class is automatically loaded when using
SOAP::WSDL::SOAP::Typelib::Fault11, so you can't B<use> it separately.
Any string or object not of this class will be automatically wrapped into
a detail object.
Note that passing a list of detail object is currently not supported (though
the SOAP1.1 note allows this).
=head1 LICENSE AND COPYRIGHT =head1 LICENSE AND COPYRIGHT
Copyright 2007 Martin Kutter. All rights reserved. Copyright 2007 Martin Kutter. All rights reserved.
@@ -101,10 +162,10 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Fault11.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: Fault11.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm $
=cut =cut

View File

@@ -5,7 +5,7 @@ use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed); use Scalar::Util qw(blessed);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
use SOAP::WSDL::Factory::Serializer; use SOAP::WSDL::Factory::Serializer;
@@ -30,10 +30,11 @@ sub serialize {
my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS }; my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS };
# envelope start with namespaces # envelope start with namespaces
my $xml = "<$soap_prefix\:Envelope "; my $xml = qq|<?xml version="1.0" ?><$soap_prefix\:Envelope |;
while (my ($uri, $prefix) = each %{ $opt->{ namespace } }) for my $uri ( sort { $a cmp $b } keys %{ $opt->{ namespace } } )
{ {
my $prefix = $opt->{ namespace }->{ $uri };
$xml .= "xmlns:$prefix=\"$uri\" "; $xml .= "xmlns:$prefix=\"$uri\" ";
} }
# #
@@ -50,7 +51,7 @@ sub serialize {
} }
sub serialize_header { sub serialize_header {
my ($self, $name, $data, $opt) = @_; my ($self, $method, $data, $opt) = @_;
# header is optional. Leave out if there's no header data # header is optional. Leave out if there's no header data
return q{} if not $data; return q{} if not $data;
@@ -62,8 +63,11 @@ sub serialize_header {
} }
sub serialize_body { sub serialize_body {
my ($self, $name, $data, $opt) = @_; my ($self, $method, $data, $opt) = @_;
$data->__set_name("$opt->{prefix}:$name") if $opt->{prefix};
# TODO This one wipes out the old class' XML name globally
# Fix in some more appropriate place...
$data->__set_name("$opt->{prefix}:" . $data->__get_name() ) if $opt->{prefix};
# Body is NOT optional. Serialize to empty body # Body is NOT optional. Serialize to empty body
# if we have no data. # if we have no data.
@@ -129,10 +133,10 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 677 $ $Rev: 851 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: XSD.pm 677 2008-05-18 20:17:56Z kutterma $ $Id: XSD.pm 851 2009-05-15 22:45:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
=cut =cut

View File

@@ -6,7 +6,7 @@ use Scalar::Util qw(blessed);
use SOAP::WSDL::Factory::Deserializer; use SOAP::WSDL::Factory::Deserializer;
use SOAP::WSDL::Factory::Serializer; use SOAP::WSDL::Factory::Serializer;
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
my %dispatch_to_of :ATTR(:name<dispatch_to> :default<()>); my %dispatch_to_of :ATTR(:name<dispatch_to> :default<()>);
my %action_map_ref_of :ATTR(:name<action_map_ref> :default<{}>); my %action_map_ref_of :ATTR(:name<action_map_ref> :default<{}>);
@@ -42,7 +42,7 @@ sub handle {
}; };
if ($@) { if ($@) {
die $deserializer_of{ $ident }->generate_fault({ die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server', code => 'SOAP-ENV:Server',
role => 'urn:localhost', role => 'urn:localhost',
message => "Error deserializing message: $@. \n" message => "Error deserializing message: $@. \n"
}); });
@@ -65,7 +65,7 @@ sub handle {
if (!$dispatch_to_of{ $ident }) { if (!$dispatch_to_of{ $ident }) {
die $deserializer_of{ $ident }->generate_fault({ die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server', code => 'SOAP-ENV:Server',
role => 'urn:localhost', role => 'urn:localhost',
message => "No handler registered", message => "No handler registered",
}); });
@@ -73,7 +73,7 @@ sub handle {
if (! defined $request->header('SOAPAction') ) { if (! defined $request->header('SOAPAction') ) {
die $deserializer_of{ $ident }->generate_fault({ die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server', code => 'SOAP-ENV:Server',
role => 'urn:localhost', role => 'urn:localhost',
message => "Not found: No SOAPAction given", message => "Not found: No SOAPAction given",
}); });
@@ -81,7 +81,7 @@ sub handle {
if (! defined $method_name) { if (! defined $method_name) {
die $deserializer_of{ $ident }->generate_fault({ die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server', code => 'SOAP-ENV:Server',
role => 'urn:localhost', role => 'urn:localhost',
message => "Not found: No method found for the SOAPAction '$soap_action'", message => "Not found: No method found for the SOAPAction '$soap_action'",
}); });
@@ -92,7 +92,7 @@ sub handle {
if (!$method_ref) { if (!$method_ref) {
die $deserializer_of{ $ident }->generate_fault({ die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server', code => 'SOAP-ENV:Server',
role => 'urn:localhost', role => 'urn:localhost',
message => "Not implemented: The handler does not implement the method $method_name", message => "Not implemented: The handler does not implement the method $method_name",
}); });
@@ -190,7 +190,7 @@ SOAP::Server's deserializer create one for you:
my $soap = MyServer::SomeService->new(); my $soap = MyServer::SomeService->new();
die $soap->get_deserializer()->generate_fault({ die $soap->get_deserializer()->generate_fault({
code => 'soap:Server', code => 'SOAP-ENV:Server',
role => 'urn:localhost', role => 'urn:localhost',
message => "The error message to pas back", message => "The error message to pas back",
detail => "Some details on the error", detail => "Some details on the error",
@@ -199,6 +199,38 @@ SOAP::Server's deserializer create one for you:
You may use any other object as exception, provided it has a You may use any other object as exception, provided it has a
serialize() method which returns the object's XML representation. serialize() method which returns the object's XML representation.
=head2 Subclassing
To write a transport-specific SOAP Server, you should subclass
SOAP::WSDL::Server.
See the C<SOAP::WSDL::Server::*> modules for examples.
A SOAP Server must call the following method to actually handle the request:
=head3 handle
Handles the SOAP request.
Returns the response message as XML.
Expects a C<HTTP::Request> object as only parameter.
You may use any other object as parameter, as long as it implements the
following methods:
=over
=item * header
Called as header('SOAPAction'). Must return the corresponding HTTP header.
=item * content
Returns the request message
=back
=head1 LICENSE AND COPYRIGHT =head1 LICENSE AND COPYRIGHT
Copyright 2004-2008 Martin Kutter. Copyright 2004-2008 Martin Kutter.

View File

@@ -2,6 +2,8 @@ package SOAP::WSDL::Server::CGI;
use strict; use strict;
use warnings; use warnings;
use Encode;
use HTTP::Request; use HTTP::Request;
use HTTP::Response; use HTTP::Response;
use HTTP::Status; use HTTP::Status;
@@ -12,7 +14,7 @@ use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Server); use base qw(SOAP::WSDL::Server);
use version; our $VERSION = qv('2.00.03'); our $VERSION = $SOAP::WSDL::VERSION;
# mostly copied from SOAP::Lite. Unfortunately we can't use SOAP::Lite's CGI # mostly copied from SOAP::Lite. Unfortunately we can't use SOAP::Lite's CGI
# server directly - we would have to swap out it's base class... # server directly - we would have to swap out it's base class...
@@ -80,7 +82,7 @@ sub handle {
else { else {
$response = HTTP::Response->new(200); $response = HTTP::Response->new(200);
$response->header('Content-type' => 'text/xml; charset="utf-8"'); $response->header('Content-type' => 'text/xml; charset="utf-8"');
$response->content( $response_message ); $response->content( encode('utf8', $response_message ) );
{ {
use bytes; use bytes;
$response->header('Content-length', length $response_message); $response->header('Content-length', length $response_message);

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