Compare commits
41 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c35791c506 | ||
|
|
b803f83abd | ||
|
|
e95ff8baba | ||
|
|
cad782dbf2 | ||
|
|
99c5eb4dd7 | ||
|
|
a1e9927846 | ||
|
|
ba407622f5 | ||
|
|
5b9f3c640b | ||
|
|
ed715a4c88 | ||
|
|
f5787f6057 | ||
|
|
374793ef68 | ||
|
|
7f6af60ed8 | ||
|
|
37740b870a | ||
|
|
31f5deacf5 | ||
|
|
3197383a7d | ||
|
|
285ffa463c | ||
|
|
35321ce5d0 | ||
|
|
08b156a546 | ||
|
|
605732b836 | ||
|
|
1994b36d8b | ||
|
|
f3ae85aed5 | ||
|
|
7d81cfce87 | ||
|
|
2624a9d5c0 | ||
|
|
45982ff330 | ||
|
|
cfd5892b18 | ||
|
|
6e95d01610 | ||
|
|
b121a061d8 | ||
|
|
d2f324a7f2 | ||
|
|
f2ce9511e0 | ||
|
|
50c8d5b31f | ||
|
|
47dc61bd9e | ||
|
|
3670df3e69 | ||
|
|
d221e87b29 | ||
|
|
001c36f8e8 | ||
|
|
9023aa06a4 | ||
|
|
3b30e8d0e2 | ||
|
|
fb9fd4a2b1 | ||
|
|
bfc3247583 | ||
|
|
3de318be40 | ||
|
|
c2ac24dd0f | ||
|
|
c3e3d1908e |
55
Build.PL
55
Build.PL
@@ -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
252
Changes
@@ -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.
|
||||
@@ -20,6 +82,7 @@ Features:
|
||||
* Efficient documentation
|
||||
o SOAP::WSDL::Manual guides you at getting your work done, not at
|
||||
the module's internals
|
||||
* Examples in Perl and Java
|
||||
* Thorough test suite
|
||||
o SOAP::WSDL is heavily regression tested, with a test coverage of
|
||||
over 95% (excluding documentation - you wouldn't want to read
|
||||
@@ -27,7 +90,7 @@ Features:
|
||||
* SOAP::Lite like look and feel
|
||||
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migration
|
||||
* 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.
|
||||
The following plugins are supported:
|
||||
o Transport plugins via SOAP::WSDL::Factory::Transport
|
||||
@@ -36,6 +99,190 @@ Features:
|
||||
|
||||
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
|
||||
|
||||
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):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
* [ 1963613 ] ComplexTypes die on ->can('FOOBAR');
|
||||
* [ 1943667 ] Error parsing complexType/extension
|
||||
* [ 1960650 ] multi-level inheritance of complexTypes fails
|
||||
* [ 1960319 ] ComplexType as_hash_ref returns objects on maximum depth
|
||||
|
||||
44
MANIFEST
44
MANIFEST
@@ -20,6 +20,16 @@ example/genericbarcode.pl
|
||||
example/hello.pl
|
||||
example/hello_compile.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/CountCookiesResponse.pm
|
||||
example/lib/MyElements/GenerateBarCode.pm
|
||||
@@ -69,6 +79,7 @@ example/lib/MyTypes/test2.pm
|
||||
example/lib/MyTypes/testExtended.pm
|
||||
example/person.pl
|
||||
example/person_compile.pl
|
||||
example/server/hello_simple.pl
|
||||
example/visitor/visitor.pl
|
||||
example/weather.pl
|
||||
example/weather_wsdl.pl
|
||||
@@ -77,6 +88,7 @@ example/wsdl/FortuneCookie.xml
|
||||
example/wsdl/genericbarcode.xml
|
||||
example/wsdl/globalweather.xml
|
||||
example/wsdl/Person.wsdl
|
||||
example/wsdl/person.xml
|
||||
HACKING
|
||||
lib/SOAP/WSDL.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/Typemap.tt
|
||||
lib/SOAP/WSDL/Generator/Visitor.pm
|
||||
lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
||||
lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
|
||||
lib/SOAP/WSDL/Manual.pod
|
||||
lib/SOAP/WSDL/Manual/CodeFirst.pod
|
||||
lib/SOAP/WSDL/Manual/Cookbook.pod
|
||||
lib/SOAP/WSDL/Manual/Deserializer.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/CGI.pm
|
||||
lib/SOAP/WSDL/Server/Mod_Perl2.pm
|
||||
lib/SOAP/WSDL/Server/Simple.pm
|
||||
lib/SOAP/WSDL/Service.pm
|
||||
lib/SOAP/WSDL/SOAP/Address.pm
|
||||
lib/SOAP/WSDL/SOAP/Body.pm
|
||||
lib/SOAP/WSDL/SOAP/Header.pm
|
||||
lib/SOAP/WSDL/SOAP/HeaderFault.pm
|
||||
lib/SOAP/WSDL/SOAP/Operation.pm
|
||||
lib/SOAP/WSDL/SOAP/Typelib/Fault.pm
|
||||
lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
||||
lib/SOAP/WSDL/Transport/HTTP.pm
|
||||
lib/SOAP/WSDL/Transport/Loopback.pm
|
||||
@@ -273,14 +287,13 @@ README
|
||||
t/002_parse_wsdl.t
|
||||
t/003_wsdl_based_serializer.t
|
||||
t/006_client.t
|
||||
t/007_envelope.t
|
||||
t/008_client_wsdl_complexType.t
|
||||
t/009_data_classes.t
|
||||
t/011_simpleType.t
|
||||
t/012_element.t
|
||||
t/013_complexType.t
|
||||
t/016_client_object.t
|
||||
t/020_storable.t
|
||||
t/094_cpan_meta.t
|
||||
t/095_copying.t
|
||||
t/096_characters.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/10_helloworld.asmx.xml
|
||||
t/acceptance/wsdl/11_helloworld.wsdl
|
||||
t/acceptance/wsdl/contributed/Axis.wsdl
|
||||
t/acceptance/wsdl/contributed/ETest.wsdl
|
||||
t/acceptance/wsdl/contributed/gasquery.wsdl
|
||||
t/acceptance/wsdl/contributed/OITest.wsdl
|
||||
t/acceptance/wsdl/contributed/tools.wsdl
|
||||
t/acceptance/wsdl/elementAtomicComplexType.xml
|
||||
t/acceptance/wsdl/email_account.wsdl
|
||||
t/acceptance/wsdl/generator_test.wsdl
|
||||
@@ -331,11 +339,16 @@ t/acceptance/wsdl/WSDLParser/import_xsd_cascade.wsdl
|
||||
t/acceptance/wsdl/WSDLParser/imported.xsd
|
||||
t/acceptance/wsdl/WSDLParser/xsd_import_no_location.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/Expat/03_wsdl.t
|
||||
t/lib/CodeFirst.pm
|
||||
t/lib/Mod_Perl2Test.pm
|
||||
t/lib/MyComplexType.pm
|
||||
t/lib/MyElement.pm
|
||||
t/lib/MySimpleElement.pm
|
||||
t/lib/MySimpleType.pm
|
||||
t/lib/Test/SOAP/WSDL/Expat/WSDLParser.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/11_helloworld.NET.t
|
||||
t/SOAP/WSDL/12_binding.t
|
||||
t/SOAP/WSDL/Base.t
|
||||
t/SOAP/WSDL/Client.t
|
||||
t/SOAP/WSDL/Client/Base.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/Transport.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/Typemap.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/CGI.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/acceptance/test2.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/SimpleType.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/anyType.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/decimal.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/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/ID.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/NOTATION.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/string.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/test.wsdl
|
||||
TEST_COVERAGE
|
||||
test_html.pl
|
||||
TODO
|
||||
|
||||
373
META.yml
373
META.yml
@@ -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/
|
||||
50
Makefile.PL
50
Makefile.PL
@@ -1,6 +1,44 @@
|
||||
# Note: this file was auto-generated by Module::Build::Compat version 0.03
|
||||
use Module::Build::Compat 0.02;
|
||||
|
||||
Module::Build::Compat->run_build_pl(args => \@ARGV);
|
||||
require Module::Build;
|
||||
Module::Build::Compat->write_makefile(build_class => 'Module::Build');
|
||||
use 5.010000;
|
||||
use ExtUtils::MakeMaker;
|
||||
|
||||
WriteMakefile(
|
||||
NAME => 'SOAP::WSDL',
|
||||
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
11
README
@@ -41,4 +41,13 @@ If you don't have Module::Build installed, you may also use
|
||||
make install
|
||||
|
||||
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.
|
||||
@@ -6,12 +6,20 @@
|
||||
# Note that this shell script requires Devel::CoverX::Covered - if you
|
||||
# don't have it, comment out the line noted below
|
||||
#
|
||||
cd t/
|
||||
cover -delete
|
||||
find . -type f -name '*.t' | xargs -n 1 /usr/bin/perl -MDevel::Cover=-silent,1,-summary,0 -I../lib > /dev/null
|
||||
perl Build.PL && perl Build && \
|
||||
perl -MTAP::Harness -MFile::Find::Rule -e '
|
||||
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
|
||||
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"
|
||||
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
use Benchmark qw(cmpthese);
|
||||
use Benchmark qw(cmpthese timethis timethese);
|
||||
use POSIX ();
|
||||
use Date::Format ();
|
||||
|
||||
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 '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";
|
||||
|
||||
@@ -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 Data::Dumper;
|
||||
use SOAP::Lite;
|
||||
use XML::Compile::SOAP11;
|
||||
use XML::Compile::WSDL11;
|
||||
use XML::Compile::Transport::SOAPHTTP;
|
||||
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||
use SOAP::WSDL::Deserializer::XSD_XS;
|
||||
#use SOAP::WSDL::Deserializer::XSD_XS;
|
||||
use Benchmark qw(cmpthese timethese);
|
||||
|
||||
use SOAP::WSDL::Transport::HTTP;
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
SOAP::WSDL::Factory::Transport->register('http', 'SOAP::WSDL::Transport::HTTP');
|
||||
|
||||
#my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld.pl';
|
||||
my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld';
|
||||
my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld.pl';
|
||||
#my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld';
|
||||
|
||||
my $lite = SOAP::Lite->new(
|
||||
proxy => $proxy
|
||||
@@ -35,7 +36,7 @@ my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new({
|
||||
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new({
|
||||
proxy => $proxy,
|
||||
});
|
||||
$soap_xs->set_deserializer( SOAP::WSDL::Deserializer::XSD_XS->new() );
|
||||
#$soap_xs->set_deserializer( SOAP::WSDL::Deserializer::XSD_XS->new() );
|
||||
|
||||
my @result = ();;
|
||||
|
||||
@@ -81,11 +82,11 @@ sub lite_bench {
|
||||
compile_bench();
|
||||
lite_bench();
|
||||
wsdl_bench();
|
||||
wsdl_xs_bench();
|
||||
#wsdl_xs_bench();
|
||||
|
||||
timethese 150, {
|
||||
'SOAP::WSDL' => \&wsdl_bench,
|
||||
'SOAP::WSDL_XS' => \&wsdl_xs_bench,
|
||||
# 'SOAP::WSDL_XS' => \&wsdl_xs_bench,
|
||||
'XML::Compile' => \&compile_bench,
|
||||
'SOAP::Lite' => \&lite_bench,
|
||||
};
|
||||
|
||||
@@ -8,6 +8,7 @@ use strict;
|
||||
|
||||
use Benchmark qw(cmpthese);
|
||||
|
||||
use XML::Compile::SOAP11;
|
||||
use XML::Compile::Transport::SOAPHTTP();
|
||||
use XML::Compile::Util;
|
||||
use XML::Compile::WSDL11;
|
||||
@@ -16,7 +17,7 @@ use XML::Simple;
|
||||
use SOAP::Lite;
|
||||
use MyInterfaces::TestService::TestPort;
|
||||
|
||||
use SOAP::WSDL::Deserializer::XSD_XS;
|
||||
#use SOAP::WSDL::Deserializer::XSD_XS;
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
|
||||
#
|
||||
@@ -82,17 +83,17 @@ my $person = {
|
||||
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl',
|
||||
sloppy_integers => 1,
|
||||
check_values => 0,
|
||||
check_values => 0,
|
||||
validation => 0,
|
||||
ignore_facets => 1,
|
||||
);
|
||||
|
||||
#
|
||||
# Call all variants once to allow their first-time tasks to be done
|
||||
#
|
||||
|
||||
my $call = $compile->compileClient('ListPerson');
|
||||
$call->({ in => undef});
|
||||
|
||||
# Initialize SOAP::Lite
|
||||
my $deserializer = SOAP::Deserializer->new();
|
||||
|
||||
# Initialize SOAP::WSDL interface
|
||||
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||
# Load all classes - XML::Compile has created everything before, too
|
||||
@@ -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');
|
||||
$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
|
||||
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
|
||||
my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
|
||||
#SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
|
||||
#my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
|
||||
|
||||
my $count = 70;
|
||||
my @data = ();
|
||||
@@ -114,42 +124,52 @@ SOAP::Lite - $SOAP::Lite::VERSION
|
||||
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
|
||||
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
|
||||
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
|
||||
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
|
||||
";
|
||||
$n++;
|
||||
cmpthese $count, {
|
||||
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
|
||||
'XML::Compile' => sub { my $result = $call->() },
|
||||
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
|
||||
'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
|
||||
'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";
|
||||
$n++;
|
||||
cmpthese $count, {
|
||||
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||
'XML::Compile' => sub { push @data, $call->() },
|
||||
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
||||
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
|
||||
'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 = ();
|
||||
print "\nBenchmark $n: Play it again, Sam\n";
|
||||
print "\nBenchmark $n: Play it, please play it again, Sam\n";
|
||||
$n++;
|
||||
cmpthese $count, {
|
||||
|
||||
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
||||
'XML::Compile' => sub { push @data, $call->() },
|
||||
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
|
||||
# 'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
||||
# 'XML::Compile' => sub { push @data, $call->() },
|
||||
# 'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
|
||||
};
|
||||
|
||||
print "\nBenchmark $n: ca. 1kB request - result destroyed immediately\n";
|
||||
$n++;
|
||||
cmpthese $count, {
|
||||
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({ in => $person }) },
|
||||
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({ in => $person }) },
|
||||
# 'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({ 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++;
|
||||
cmpthese $count, {
|
||||
'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 }) },
|
||||
};
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ use lib '../../SOAP-WSDL_XS/blib/arch';
|
||||
use strict;
|
||||
use Benchmark;
|
||||
use Storable;
|
||||
#use SOAP::WSDL::Deserializer::XSD_XS;
|
||||
use SOAP::WSDL::Deserializer::XSD_XS;
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
# # register for SOAP 1.1
|
||||
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
|
||||
@@ -16,10 +16,10 @@ my @data = ();
|
||||
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||
|
||||
# Load all classes - XML::Compile has created everything before, too
|
||||
#timethis 100, sub { $soap->ListPerson({}) };
|
||||
#timethis 50, sub { push @data, $soap->ListPerson({}) };
|
||||
#@data = ();
|
||||
# timethis 50, sub { push @data, $soap->ListPerson({}) };
|
||||
timethis 150, sub { $soap->ListPerson({}) };
|
||||
timethis 300, sub { push @data, $soap->ListPerson({}) };
|
||||
@data = ();
|
||||
timethis 300, sub { push @data, $soap->ListPerson({}) };
|
||||
|
||||
# for (1..50) { push @data, $soap->ListPerson({}) };
|
||||
#print $soap->ListPerson({});
|
||||
|
||||
@@ -10,13 +10,13 @@ use Term::ReadKey;
|
||||
|
||||
my %opt = (
|
||||
url => '',
|
||||
prefix => undef,
|
||||
attribute_prefix => 'MyAttributes',
|
||||
type_prefix => 'MyTypes',
|
||||
element_prefix => 'MyElements',
|
||||
typemap_prefix => 'MyTypemaps',
|
||||
interface_prefix => 'MyInterfaces',
|
||||
server_prefix => 'MyServer',
|
||||
prefix => 'My',
|
||||
attribute_prefix => undef,
|
||||
type_prefix => undef,
|
||||
element_prefix => undef,
|
||||
typemap_prefix => undef,
|
||||
interface_prefix => undef,
|
||||
server_prefix => undef,
|
||||
base_path => 'lib/',
|
||||
proxy => undef,
|
||||
generator => 'XSD',
|
||||
@@ -86,11 +86,26 @@ my $lwp = LWP::UserAgent->new(
|
||||
: ()
|
||||
);
|
||||
$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({
|
||||
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 %typemap = ();
|
||||
@@ -150,7 +165,9 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
|
||||
|
||||
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.
|
||||
Default: MyAttributes
|
||||
type_prefix t Prefix for type classes.
|
||||
|
||||
@@ -7,7 +7,9 @@ use lib 'lib'; # just needed because interface lies here
|
||||
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||
|
||||
# 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
|
||||
my $result = $soap->sayHello({
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use XML::Compile::SOAP11;
|
||||
use XML::Compile::WSDL11;
|
||||
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
|
||||
my $wsdl = XML::Compile::WSDL11->new('wsdl/11_helloworld.wsdl');
|
||||
|
||||
# I compile a interface method for a single SOAP method 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');
|
||||
|
||||
# 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->(
|
||||
name => $ARGV[1] || '"Your name"',
|
||||
givenName => $ARGV[0] || '"Your given name"',
|
||||
@@ -22,4 +25,5 @@ my $result = $call->(
|
||||
die "Error calling soap method" if not defined $result;
|
||||
|
||||
# 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";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/perl -w
|
||||
#use strict;
|
||||
use warnings;
|
||||
use SOAP::Lite +trace;
|
||||
use SOAP::Lite; # +trace;
|
||||
|
||||
# I have to lookup the URL from the WSDL
|
||||
my $soap = SOAP::Lite->new(
|
||||
|
||||
10
example/java/cxf/.classpath
Normal file
10
example/java/cxf/.classpath
Normal 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>
|
||||
5
example/java/cxf/.settings/org.eclipse.jdt.core.prefs
Normal file
5
example/java/cxf/.settings/org.eclipse.jdt.core.prefs
Normal 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
|
||||
8
example/java/cxf/.settings/org.maven.ide.eclipse.prefs
Normal file
8
example/java/cxf/.settings/org.maven.ide.eclipse.prefs
Normal 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
|
||||
95
example/java/cxf/11_helloworld.wsdl
Normal file
95
example/java/cxf/11_helloworld.wsdl
Normal 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
22
example/java/cxf/README
Normal 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.
|
||||
15
example/java/cxf/jax-binding.xml
Normal file
15
example/java/cxf/jax-binding.xml
Normal 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
181
example/java/cxf/pom.xml
Normal 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>
|
||||
21
example/java/cxf/src/main/resources/cxf.xml
Normal file
21
example/java/cxf/src/main/resources/cxf.xml
Normal 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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
16
example/java/cxf/src/test/resources/test-context.xml
Normal file
16
example/java/cxf/src/test/resources/test-context.xml
Normal 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>
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyElements::CountCookies;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -17,13 +18,30 @@ use base qw(
|
||||
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
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -36,6 +54,21 @@ MyElements::CountCookies
|
||||
Perl data type class for the XML Schema defined element
|
||||
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
|
||||
|
||||
=head2 new
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyElements::CountCookiesResponse;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -16,6 +17,14 @@ use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
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 base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
@@ -26,14 +35,18 @@ Class::Std::initialize();
|
||||
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[ qw(
|
||||
CountCookiesResult
|
||||
[ qw( 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
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -61,6 +75,30 @@ MyElements::CountCookiesResponse
|
||||
Perl data type class for the XML Schema defined element
|
||||
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
|
||||
|
||||
=head2 new
|
||||
|
||||
@@ -43,12 +43,6 @@ __PACKAGE__->_factory(
|
||||
|
||||
} # end BLOCK
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} # end of BLOCK
|
||||
1;
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyElements::GetFortuneCookie;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -17,13 +18,30 @@ use base qw(
|
||||
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
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -36,6 +54,21 @@ MyElements::GetFortuneCookie
|
||||
Perl data type class for the XML Schema defined element
|
||||
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
|
||||
|
||||
=head2 new
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyElements::GetFortuneCookieResponse;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -16,6 +17,14 @@ use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
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 base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
@@ -26,14 +35,18 @@ Class::Std::initialize();
|
||||
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[ qw(
|
||||
GetFortuneCookieResult
|
||||
[ qw( 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
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -61,6 +75,30 @@ MyElements::GetFortuneCookieResponse
|
||||
Perl data type class for the XML Schema defined element
|
||||
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
|
||||
|
||||
=head2 new
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyElements::GetSpecificCookie;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -16,6 +17,14 @@ use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
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 base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
@@ -26,14 +35,18 @@ Class::Std::initialize();
|
||||
my %index_of :ATTR(:get<index>);
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[ qw(
|
||||
index
|
||||
[ qw( 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
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -61,6 +75,30 @@ MyElements::GetSpecificCookie
|
||||
Perl data type class for the XML Schema defined element
|
||||
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
|
||||
|
||||
=head2 new
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyElements::GetSpecificCookieResponse;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -16,6 +17,14 @@ use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
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 base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
@@ -26,14 +35,18 @@ Class::Std::initialize();
|
||||
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[ qw(
|
||||
GetSpecificCookieResult
|
||||
[ qw( 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
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -61,6 +75,30 @@ MyElements::GetSpecificCookieResponse
|
||||
Perl data type class for the XML Schema defined element
|
||||
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
|
||||
|
||||
=head2 new
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyElements::int;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -14,14 +15,12 @@ __PACKAGE__->__set_ref();
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::int
|
||||
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
} # end of BLOCK
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -34,6 +33,12 @@ MyElements::int
|
||||
Perl data type class for the XML Schema defined element
|
||||
int from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=head2 new
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyElements::readNodeCount;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -17,13 +18,30 @@ use base qw(
|
||||
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
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -36,6 +54,21 @@ MyElements::readNodeCount
|
||||
Perl data type class for the XML Schema defined element
|
||||
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
|
||||
|
||||
=head2 new
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyElements::readNodeCountResponse;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -16,6 +17,14 @@ use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
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 base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
@@ -26,14 +35,18 @@ Class::Std::initialize();
|
||||
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[ qw(
|
||||
readNodeCountResult
|
||||
[ qw( 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
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -61,6 +75,30 @@ MyElements::readNodeCountResponse
|
||||
Perl data type class for the XML Schema defined element
|
||||
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
|
||||
|
||||
=head2 new
|
||||
|
||||
@@ -1,27 +1,26 @@
|
||||
|
||||
package MyElements::string;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
{ # 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_nillable(true);
|
||||
__PACKAGE__->__set_nillable(1);
|
||||
__PACKAGE__->__set_minOccurs();
|
||||
__PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
} # end of BLOCK
|
||||
1;
|
||||
|
||||
# __END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -32,7 +31,13 @@ MyElements::string
|
||||
=head1 DESCRIPTION
|
||||
|
||||
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
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@ sub START {
|
||||
$_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy};
|
||||
$_[0]->set_class_resolver('MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie')
|
||||
if not $_[2]->{class_resolver};
|
||||
|
||||
$_[0]->set_prefix($_[2]->{use_prefix}) if exists $_[2]->{use_prefix};
|
||||
}
|
||||
|
||||
sub readNodeCount {
|
||||
@@ -24,10 +26,11 @@ sub readNodeCount {
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
parts => [qw( MyElements::readNodeCount )],
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
|
||||
encodingStyle => '',
|
||||
parts => [qw( MyElements::readNodeCount )],
|
||||
},
|
||||
header => {
|
||||
|
||||
@@ -38,6 +41,7 @@ sub readNodeCount {
|
||||
}, $body, $header);
|
||||
}
|
||||
|
||||
|
||||
sub GetFortuneCookie {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "GetFortuneCookie must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
@@ -47,10 +51,11 @@ sub GetFortuneCookie {
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
parts => [qw( MyElements::GetFortuneCookie )],
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
|
||||
encodingStyle => '',
|
||||
parts => [qw( MyElements::GetFortuneCookie )],
|
||||
},
|
||||
header => {
|
||||
|
||||
@@ -61,6 +66,7 @@ sub GetFortuneCookie {
|
||||
}, $body, $header);
|
||||
}
|
||||
|
||||
|
||||
sub CountCookies {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "CountCookies must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
@@ -70,10 +76,11 @@ sub CountCookies {
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
parts => [qw( MyElements::CountCookies )],
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
|
||||
encodingStyle => '',
|
||||
parts => [qw( MyElements::CountCookies )],
|
||||
},
|
||||
header => {
|
||||
|
||||
@@ -84,6 +91,7 @@ sub CountCookies {
|
||||
}, $body, $header);
|
||||
}
|
||||
|
||||
|
||||
sub GetSpecificCookie {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "GetSpecificCookie must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
@@ -93,10 +101,11 @@ sub GetSpecificCookie {
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
parts => [qw( MyElements::GetSpecificCookie )],
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
|
||||
encodingStyle => '',
|
||||
parts => [qw( MyElements::GetSpecificCookie )],
|
||||
},
|
||||
header => {
|
||||
|
||||
@@ -109,6 +118,7 @@ sub GetSpecificCookie {
|
||||
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
|
||||
@@ -119,21 +129,20 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
|
||||
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
|
||||
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
|
||||
|
||||
|
||||
my $response;
|
||||
$response = $interface->readNodeCount();
|
||||
$response = $interface->GetFortuneCookie();
|
||||
$response = $interface->CountCookies();
|
||||
$response = $interface->GetSpecificCookie();
|
||||
|
||||
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
@@ -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
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
Get a random fortune cookie from the XML document
|
||||
|
||||
$interface->GetFortuneCookie(,,
|
||||
Returns a L<MyElements::GetFortuneCookieResponse|MyElements::GetFortuneCookieResponse> object.
|
||||
|
||||
$response = $interface->GetFortuneCookie(,,
|
||||
);
|
||||
|
||||
|
||||
=head3 CountCookies
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
},,
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
=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
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -38,11 +39,13 @@ sub get_typemap {
|
||||
|
||||
__END__
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=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
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use XML::Compile::SOAP11;
|
||||
use XML::Compile::WSDL11;
|
||||
use XML::Compile::Transport::SOAPHTTP;
|
||||
|
||||
|
||||
29
example/server/hello_simple.pl
Normal file
29
example/server/hello_simple.pl
Normal 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"
|
||||
})
|
||||
}
|
||||
@@ -7,7 +7,8 @@
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||
<wsdl:types>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
targetNamespace="http://www.example.org/benchmark/">
|
||||
targetNamespace="http://www.example.org/benchmark/"
|
||||
elementFormDefault="qualified">
|
||||
|
||||
<xsd:element name="ListPerson">
|
||||
<xsd:complexType>
|
||||
|
||||
440
example/wsdl/person.xml
Normal file
440
example/wsdl/person.xml
Normal 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>
|
||||
|
||||
132
lib/SOAP/WSDL.pm
132
lib/SOAP/WSDL.pm
@@ -10,15 +10,14 @@ use Carp;
|
||||
use Scalar::Util qw(blessed);
|
||||
use SOAP::WSDL::Client;
|
||||
use SOAP::WSDL::Expat::WSDLParser;
|
||||
use Class::Std::Fast;
|
||||
use Class::Std::Fast constructor => 'none';
|
||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||
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 %wsdl_of :ATTR(:name<wsdl>);
|
||||
my %proxy_of :ATTR(:name<proxy>);
|
||||
my %autotype_of :ATTR(:name<autotype>);
|
||||
my %outputxml_of :ATTR(:name<outputxml> :default<0>);
|
||||
my %outputtree_of :ATTR(:name<outputtree>);
|
||||
@@ -42,7 +41,6 @@ my %LOOKUP = (
|
||||
no_dispatch => \%no_dispatch_of,
|
||||
class_resolver => \%class_resolver_of,
|
||||
wsdl => \%wsdl_of,
|
||||
proxy => \%proxy_of,
|
||||
autotype => \%autotype_of,
|
||||
outputxml => \%outputxml_of,
|
||||
outputtree => \%outputtree_of,
|
||||
@@ -94,12 +92,30 @@ for my $method (keys %LOOKUP ) {
|
||||
}
|
||||
|
||||
my $ident = ident $self;
|
||||
$self->wsdlinit() if ($wsdl_of{ $ident });
|
||||
$client_of{ $ident } = SOAP::WSDL::Client->new();
|
||||
$self->wsdlinit() if ($wsdl_of{ $ident });
|
||||
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 {
|
||||
my ($self, %opt) = @_;
|
||||
my $ident = ident $self;
|
||||
@@ -109,6 +125,7 @@ sub wsdlinit {
|
||||
? (keep_alive => 1)
|
||||
: ()
|
||||
);
|
||||
$lwp->agent(qq[SOAP::WSDL $VERSION]);
|
||||
my $response = $lwp->get( $wsdl_of{ $ident } );
|
||||
croak $response->message() if ($response->code != 200);
|
||||
|
||||
@@ -132,6 +149,15 @@ sub wsdlinit {
|
||||
|
||||
$servicename_of{ $ident } = $opt{servicename} if $opt{servicename};
|
||||
$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;
|
||||
} ## end sub wsdlinit
|
||||
|
||||
@@ -139,8 +165,8 @@ sub _wsdl_get_service :PRIVATE {
|
||||
my $ident = ident shift;
|
||||
my $wsdl = $definitions_of{ $ident };
|
||||
return $service_of{ $ident } = $servicename_of{ $ident }
|
||||
? $wsdl->find_service( $wsdl->get_targetNamespace() , $servicename_of{ $ident } )
|
||||
: $service_of{ $ident } = $wsdl->get_service()->[ 0 ];
|
||||
? $wsdl->find_service( $wsdl->get_targetNamespace() , $servicename_of{ $ident } )
|
||||
: ( $service_of{ $ident } = $wsdl->get_service()->[ 0 ] );
|
||||
} ## end sub _wsdl_get_service
|
||||
|
||||
sub _wsdl_get_port :PRIVATE {
|
||||
@@ -148,9 +174,10 @@ sub _wsdl_get_port :PRIVATE {
|
||||
my $wsdl = $definitions_of{ $ident };
|
||||
my $ns = $wsdl->get_targetNamespace();
|
||||
return $port_of{ $ident } = $portname_of{ $ident }
|
||||
? $service_of{ $ident }->get_port( $ns, $portname_of{ $ident } )
|
||||
: $port_of{ $ident } = $service_of{ $ident }->get_port()->[ 0 ];
|
||||
? $service_of{ $ident }->get_port( $ns, $portname_of{ $ident } )->[ 0 ]
|
||||
: ( $port_of{ $ident } = $service_of{ $ident }->get_port()->[ 0 ] );
|
||||
}
|
||||
|
||||
sub _wsdl_get_binding :PRIVATE {
|
||||
my $self = shift;
|
||||
my $ident = ident $self;
|
||||
@@ -160,6 +187,7 @@ sub _wsdl_get_binding :PRIVATE {
|
||||
or croak "no binding found for ", $port->get_binding();
|
||||
return $binding_of{ $ident };
|
||||
}
|
||||
|
||||
sub _wsdl_get_portType :PRIVATE {
|
||||
my $self = shift;
|
||||
my $ident = ident $self;
|
||||
@@ -169,6 +197,7 @@ sub _wsdl_get_portType :PRIVATE {
|
||||
or croak "cannot find portType for " . $binding->get_type();
|
||||
return $porttype_of{ $ident };
|
||||
}
|
||||
|
||||
sub _wsdl_init_methods :PRIVATE {
|
||||
my $self = shift;
|
||||
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.
|
||||
# It returns the first parameter to allow method chaining.
|
||||
sub on_action { return shift };
|
||||
sub on_action { return shift }
|
||||
|
||||
sub call {
|
||||
my ($self, $method, @data_from) = @_;
|
||||
@@ -259,12 +288,6 @@ sub call {
|
||||
|
||||
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_outputxml( $outputxml_of{ $ident } ? 1 : 0 );
|
||||
|
||||
@@ -277,7 +300,7 @@ sub call {
|
||||
&& ( ! $no_dispatch_of{ $ident } ) ) {
|
||||
require SOAP::WSDL::Deserializer::SOM;
|
||||
$client->set_deserializer( SOAP::WSDL::Deserializer::SOM->new() );
|
||||
};
|
||||
}
|
||||
|
||||
my $method_info = $method_info_of{ $ident }->{ $method };
|
||||
|
||||
@@ -326,7 +349,24 @@ __END__
|
||||
|
||||
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,
|
||||
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,
|
||||
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.
|
||||
|
||||
The WSDL is parsed and stored in memory.
|
||||
@@ -645,8 +675,23 @@ details.
|
||||
|
||||
=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
|
||||
|
||||
=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
|
||||
|
||||
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
|
||||
|
||||
You currently can't use SOAP::WSDL with Apache SOAP datatypes like map.
|
||||
|
||||
If you want this changed, email me a copy of the specs, please.
|
||||
You can't use SOAP::WSDL with Apache SOAP datatypes like map.
|
||||
|
||||
=item * Incomplete XML Schema definitions support
|
||||
|
||||
@@ -761,6 +804,12 @@ L<http://www.cpanforum.com/dist/SOAP-WSDL>
|
||||
|
||||
=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.
|
||||
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
|
||||
the 1.2x releases.
|
||||
|
||||
Noah Robin contirbuted lots of documentation fixes, and the mod_perl server.
|
||||
|
||||
JT Justman and Noah Robin provided early feedback and bug reports for
|
||||
the 2.xx pre-releases.
|
||||
|
||||
@@ -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.
|
||||
|
||||
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
|
||||
thus provided a base (and counterpart) for SOAP::WSDL.
|
||||
|
||||
Mark Overmeer wrote XML::Compile::SOAP - competition is good for business.
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2008 Martin Kutter.
|
||||
@@ -802,13 +853,12 @@ the same terms as perl itself
|
||||
|
||||
=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
|
||||
|
||||
$Rev: 677 $
|
||||
$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 $
|
||||
https://github.com/scrottie/SOAP-WSDL
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
package SOAP::WSDL::Base;
|
||||
use strict;
|
||||
use warnings;
|
||||
use strict; use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
use List::Util qw(first);
|
||||
use List::Util;
|
||||
use Scalar::Util;
|
||||
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 %lang_of :ATTR(:name<lang> :default<()>);
|
||||
my %name_of :ATTR(:name<name> :default<()>);
|
||||
my %namespace_of :ATTR(:name<namespace> :default<()>);
|
||||
my %documentation_of :ATTR(:name<documentation> :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 %parent_of :ATTR(:name<parent> :default<()>);
|
||||
my %parent_of :ATTR(:get<parent> :default<()>);
|
||||
|
||||
my %namespaces_of :ATTR(:default<{}>);
|
||||
|
||||
@@ -22,34 +23,42 @@ sub namespaces {
|
||||
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 {
|
||||
my ($self, $ident, $arg_ref) = @_;
|
||||
#$xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
|
||||
$xmlns_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace';
|
||||
$namespaces_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
|
||||
$namespaces_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace';
|
||||
|
||||
}
|
||||
|
||||
sub DEMOLISH {
|
||||
my $self = shift;
|
||||
# delete upward references
|
||||
delete $parent_of{ ${ $self } };
|
||||
return;
|
||||
#
|
||||
# set_parent is hand-implemented to break up (weaken) the circular reference
|
||||
# between an object and it's parent
|
||||
#
|
||||
sub set_parent {
|
||||
$parent_of{ ${ $_[0]} } = $_[1];
|
||||
Scalar::Util::weaken($parent_of{ ${ $_[0]} });
|
||||
}
|
||||
|
||||
sub STORABLE_freeze_pre :CUMULATIVE {};
|
||||
sub STORABLE_freeze_post :CUMULATIVE {};
|
||||
sub STORABLE_thaw_pre :CUMULATIVE {};
|
||||
sub STORABLE_thaw_post :CUMULATIVE { return $_[0] };
|
||||
|
||||
# _accept is here to be called by visitor.
|
||||
# The visitor pattern is a level of indirection - here the visitor calls
|
||||
# $object->_accept($visitor) on each object, which in turn calls
|
||||
# $visitor->visit_$class( $object ) where $class is the object's class.
|
||||
#
|
||||
sub _accept {
|
||||
my $self = shift;
|
||||
my $class = ref $self;
|
||||
$class =~ s{ \A SOAP::WSDL:: }{}xms;
|
||||
$class =~ s{ (:? :: ) }{_}gxms;
|
||||
my $method = "visit_$class";
|
||||
no strict qw(refs); ## no critic ProhibitNoStrict
|
||||
no strict qw(refs);
|
||||
return shift->$method( $self );
|
||||
}
|
||||
|
||||
@@ -64,13 +73,12 @@ sub AUTOMETHOD {
|
||||
if ($subname =~s{^push_}{}xms) {
|
||||
my $getter = "get_$subname";
|
||||
my $setter = "set_$subname";
|
||||
## Checking here is paranoid - will fail fatally if
|
||||
## there is no setter...
|
||||
## And we would have to check getters, too.
|
||||
## Maybe do it the Conway way via the Symbol table...
|
||||
## ... can is way slow...
|
||||
# Checking here is paranoid - will fail fatally if there is no setter.
|
||||
# And we would have to check getters, too.
|
||||
# Maybe do it the Conway way via the Symbol table...
|
||||
# ... can is way slow...
|
||||
return sub {
|
||||
no strict qw(refs); ## no critic ProhibitNoStrict
|
||||
no strict qw(refs);
|
||||
my $old_value = $self->$getter();
|
||||
# Listify if not a list ref
|
||||
$old_value = $old_value ? [ $old_value ] : [] if not ref $old_value;
|
||||
@@ -84,7 +92,7 @@ sub AUTOMETHOD {
|
||||
elsif ($subname =~s {^find_}{get_}xms) {
|
||||
@values = @{ $values[0] } if ref $values[0] eq 'ARRAY';
|
||||
return sub {
|
||||
return first {
|
||||
return List::Util::first {
|
||||
$_->get_targetNamespace() eq $values[0] &&
|
||||
$_->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;
|
||||
}
|
||||
|
||||
sub init {
|
||||
my ($self, @args) = @_;
|
||||
foreach my $value (@args)
|
||||
{
|
||||
foreach my $value (@args) {
|
||||
croak @args if (not defined ($value->{ Name }));
|
||||
|
||||
if ($value->{ Name } =~m{^xmlns\:}xms) {
|
||||
# add namespaces
|
||||
$xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value };
|
||||
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 $method = "set_$name";
|
||||
$self->$method( $value->{ Value } );
|
||||
@@ -128,12 +141,15 @@ sub init {
|
||||
sub expand {
|
||||
my ($self, $qname) = @_;
|
||||
my $ns_of = $self->namespaces();
|
||||
my $parent;
|
||||
if (not $qname=~m{:}xm) {
|
||||
if (defined $ns_of->{ '#default' }) {
|
||||
return $self->get_targetNamespace(), $qname;
|
||||
# return $ns_of->{ '#default' }, $qname;
|
||||
# TODO check. Returning the targetNamespace for the default ns
|
||||
# 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);
|
||||
}
|
||||
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;
|
||||
|
||||
return ($ns_of->{ $prefix }, $localname) if ($ns_of->{ $prefix });
|
||||
if (my $parent = $self->get_parent()) {
|
||||
if ($parent = $self->get_parent()) {
|
||||
return $parent->expand($qname);
|
||||
}
|
||||
croak "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are "
|
||||
@@ -151,6 +167,13 @@ sub expand {
|
||||
sub _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;
|
||||
|
||||
__END__
|
||||
|
||||
@@ -2,10 +2,10 @@ package SOAP::WSDL::Binding;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
use List::Util qw(first);
|
||||
|
||||
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 %type_of :ATTR(:name<type> :default<()>);
|
||||
|
||||
@@ -11,7 +11,7 @@ use SOAP::WSDL::Factory::Serializer;
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
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 %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 %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 %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 %deserializer_of :ATTR(:name<deserializer> :default<()>);
|
||||
my %deserializer_args_of :ATTR(:name<deserializer_args> :default<{}>);
|
||||
|
||||
sub BUILD {
|
||||
my ($self, $ident, $attrs_of_ref) = @_;
|
||||
@@ -147,6 +149,7 @@ sub call {
|
||||
my $response = $transport->send_receive(
|
||||
endpoint => $self->get_endpoint(),
|
||||
content_type => $content_type_of{ $ident },
|
||||
encoding => $encoding_of{ $ident },
|
||||
envelope => $envelope,
|
||||
action => $soap_action,
|
||||
# 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 } );
|
||||
|
||||
# get deserializer
|
||||
use Data::Dumper;
|
||||
$deserializer_of{ $ident } ||= SOAP::WSDL::Factory::Deserializer->get_deserializer({
|
||||
soap_version => $soap_version_of{ $ident },
|
||||
%{ $deserializer_args_of{ $ident } },
|
||||
});
|
||||
|
||||
# set class resolver if serializer supports it
|
||||
@@ -166,20 +171,29 @@ sub call {
|
||||
# Try deserializing response - there may be some,
|
||||
# even if transport did not succeed (got a 500 response)
|
||||
if ( $response ) {
|
||||
my ($result_body, $result_header) = eval {
|
||||
$deserializer_of{ $ident }->deserialize( $response );
|
||||
# as our faults are false, returning a success marker is the only
|
||||
# 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
|
||||
? ($result_body, $result_header)
|
||||
: $result_body;
|
||||
}
|
||||
return $deserializer_of{ $ident }->generate_fault({
|
||||
code => 'soap:Server',
|
||||
role => 'urn:localhost',
|
||||
message => "Error deserializing message: $@. \n"
|
||||
. "Message was: \n$response"
|
||||
});
|
||||
elsif (blessed $@) { #}&& $@->isa('SOAP::WSDL::SOAP::Typelib::Fault11')) {
|
||||
return $@;
|
||||
}
|
||||
else {
|
||||
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)
|
||||
@@ -395,10 +409,10 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Client.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/Client.pm $
|
||||
$Id: Client.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ use warnings;
|
||||
use base 'SOAP::WSDL::Client';
|
||||
use Scalar::Util qw(blessed);
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
sub call {
|
||||
my ($self, $method, $body, $header) = @_;
|
||||
@@ -22,7 +22,7 @@ sub call {
|
||||
# parameters given
|
||||
my @part_from = ();
|
||||
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) || {});
|
||||
}
|
||||
|
||||
@@ -33,10 +33,10 @@ sub call {
|
||||
# if we have a 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) {
|
||||
my $class = $method->{ header }->{ parts }->[0];
|
||||
eval "require $class" || die $@;
|
||||
eval "require $class" || die $@; ## no critic (ProhibitStringyEval)
|
||||
$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
|
||||
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
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
@@ -78,9 +85,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Base.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/Client/Base.pm $
|
||||
$Id: Base.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,26 +1,22 @@
|
||||
package SOAP::WSDL::Definitions;
|
||||
use utf8;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Carp;
|
||||
use File::Basename;
|
||||
use File::Path;
|
||||
use List::Util qw(first);
|
||||
use Class::Std::Fast::Storable;
|
||||
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 %message_of :ATTR(:name<message> :default<[]>);
|
||||
my %portType_of :ATTR(:name<portType> :default<[]>);
|
||||
my %binding_of :ATTR(:name<binding> :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
|
||||
my %attributes_of :ATTR();
|
||||
%attributes_of = (
|
||||
#my %attributes_of :ATTR();
|
||||
my %attributes_of = (
|
||||
binding => \%binding_of,
|
||||
message => \%message_of,
|
||||
portType => \%portType_of,
|
||||
@@ -44,6 +40,7 @@ BLOCK: {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
||||
=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
|
||||
element(s).
|
||||
|
||||
=head2 find_service
|
||||
=head2 find_binding
|
||||
|
||||
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
|
||||
element(s).
|
||||
|
||||
=head2 find_service
|
||||
=head2 find_message
|
||||
|
||||
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
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Definitions.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/Definitions.pm $
|
||||
$Id: Definitions.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ use SOAP::WSDL::Expat::Message2Hash;
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
sub BUILD {
|
||||
my ($self, $ident, $args_of_ref) = @_;
|
||||
@@ -38,7 +38,7 @@ sub deserialize {
|
||||
sub generate_fault {
|
||||
my ($self, $args_from_ref) = @_;
|
||||
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',
|
||||
faultstring => $args_from_ref->{ message } || "Unknown error"
|
||||
});
|
||||
@@ -139,9 +139,20 @@ a parse error appears
|
||||
|
||||
=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
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
Copyright 2004-2008 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself.
|
||||
@@ -152,9 +163,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Hash.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/Deserializer/Hash.pm $
|
||||
$Id: Hash.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Deserializer::SOM;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
our @ISA;
|
||||
|
||||
eval {
|
||||
@@ -13,6 +13,18 @@ or die "Cannot load SOAP::Lite.
|
||||
Cannot deserialize to SOM object without 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 {
|
||||
my ($self, $args_from_ref) = @_;
|
||||
# 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>
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
You cannot specify what to do when an error occurs - SOAP::WSDL will die
|
||||
with a SOAP::Fault object on transport errors.
|
||||
You cannot specify what to do when an error occurs - SOAP::WSDL will return
|
||||
a SOAP::Fault object on transport errors.
|
||||
|
||||
=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
|
||||
to generate_fault.
|
||||
|
||||
This also means that a SOAP::Fault may be thrown as exception when using
|
||||
|
||||
|
||||
=back
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
@@ -114,9 +140,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: SOM.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/Deserializer/SOM.pm $
|
||||
$Id: SOM.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -5,31 +5,41 @@ use Class::Std::Fast::Storable;
|
||||
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||
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 {
|
||||
my ($self, $ident, $args_of_ref) = @_;
|
||||
|
||||
# ignore all options except 'class_resolver'
|
||||
for (keys %{ $args_of_ref }) {
|
||||
delete $args_of_ref->{ $_ } if $_ ne 'class_resolver';
|
||||
next if $_ eq 'strict';
|
||||
next if $_ eq 'class_resolver';
|
||||
delete $args_of_ref->{ $_ };
|
||||
}
|
||||
}
|
||||
|
||||
sub deserialize {
|
||||
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 } };
|
||||
$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 ) };
|
||||
if ($@) {
|
||||
return $self->generate_fault({
|
||||
code => 'soap:Server',
|
||||
code => 'SOAP-ENV:Server',
|
||||
role => 'urn:localhost',
|
||||
message => "Error deserializing message: $@. \n"
|
||||
. "Message was: \n$content"
|
||||
@@ -41,7 +51,7 @@ sub deserialize {
|
||||
sub generate_fault {
|
||||
my ($self, $args_from_ref) = @_;
|
||||
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',
|
||||
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()
|
||||
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
|
||||
|
||||
=head2 deserialize
|
||||
@@ -86,6 +110,10 @@ Deserializes the message.
|
||||
Generates a L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
|
||||
object and returns it.
|
||||
|
||||
=head2 set_strict
|
||||
|
||||
Enable/disable strict XML parsing. Default is enabled.
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
@@ -99,9 +127,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: XSD.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/Deserializer/XSD.pm $
|
||||
$Id: XSD.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -6,7 +6,7 @@ use XML::Parser::Expat;
|
||||
|
||||
# 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 {
|
||||
my ($class, $arg_ref) = @_;
|
||||
@@ -35,17 +35,23 @@ sub get_uri { return $_[0]->{ uri }; }
|
||||
sub set_user_agent { $_[0]->{ user_agent } = $_[1]; }
|
||||
sub get_user_agent { return $_[0]->{ user_agent }; }
|
||||
|
||||
# Mark a URI as "already parsed"
|
||||
sub set_parsed {
|
||||
my ($self, $uri) = @_;
|
||||
$self->{ parsed }->{ $uri } = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
# returns true if a specific URI has already been parsed
|
||||
sub is_parsed {
|
||||
my ($self, $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 {
|
||||
my $self = shift;
|
||||
my $uri = shift;
|
||||
@@ -74,6 +80,7 @@ sub parse {
|
||||
$_[0]->{ parser }->release();
|
||||
};
|
||||
$_[0]->{ parser }->xpcroak( $@ ) if $@;
|
||||
delete $_[0]->{ parser };
|
||||
return $_[0]->{ data };
|
||||
}
|
||||
|
||||
@@ -83,6 +90,7 @@ sub parsefile {
|
||||
$_[0]->{ parser }->release();
|
||||
};
|
||||
$_[0]->{ parser }->xpcroak( $@ ) if $@;
|
||||
delete $_[0]->{ parser };
|
||||
return $_[0]->{ data };
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ use strict;
|
||||
use warnings;
|
||||
use base qw(SOAP::WSDL::Expat::Base);
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
sub _initialize {
|
||||
my ($self, $parser) = @_;
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
#!/usr/bin/perl
|
||||
package SOAP::WSDL::Expat::MessageParser;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Carp qw(croak confess);
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
use strict; use warnings;
|
||||
|
||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||
|
||||
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();
|
||||
|
||||
# keep track of classes loaded
|
||||
my %LOADED_OF = ();
|
||||
|
||||
sub new {
|
||||
@@ -46,7 +47,10 @@ sub class_resolver {
|
||||
sub load_classes {
|
||||
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);
|
||||
my $class = $_;
|
||||
|
||||
@@ -54,9 +58,10 @@ sub load_classes {
|
||||
next if $class eq '__SKIP__';
|
||||
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 .= '.pm';
|
||||
require $class;
|
||||
require "$class.pm"; ## no critic (RequireBarewordIncludes)
|
||||
}
|
||||
$LOADED_OF{ $self->{ class_resolver } } = 1;
|
||||
}
|
||||
@@ -103,19 +108,18 @@ sub _initialize {
|
||||
return;
|
||||
}
|
||||
)
|
||||
: ();
|
||||
: (
|
||||
0 => sub { $depth++ },
|
||||
1 => sub { $depth++ },
|
||||
);
|
||||
|
||||
# use "globals" for speed
|
||||
my ($_prefix, $_method,
|
||||
$_class, $_leaf) = ();
|
||||
my ($_prefix, $_method, $_class, $_leaf) = ();
|
||||
|
||||
my $char_handler = sub {
|
||||
return if (!$_leaf); # we only want characters in leaf nodes
|
||||
|
||||
$characters .= $_[1];
|
||||
# if $_[1] =~m{ [^\s] }xms;
|
||||
|
||||
return;
|
||||
return if (!$_leaf); # we only want characters in leaf nodes
|
||||
$characters .= $_[1]; # add to characters
|
||||
return; # return void
|
||||
};
|
||||
|
||||
no strict qw(refs);
|
||||
@@ -136,11 +140,14 @@ sub _initialize {
|
||||
return if $skip; # skip inside __SKIP__
|
||||
|
||||
# resolve class of this element
|
||||
$_class = $self->{ class_resolver }->get_class( $path )
|
||||
or die "Cannot resolve class for "
|
||||
. join('/', @{ $path }) . " via " . $self->{ class_resolver };
|
||||
$_class = $self->{ class_resolver }->get_class( $path );
|
||||
|
||||
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 });
|
||||
$_[0]->setHandlers( Char => undef );
|
||||
return;
|
||||
@@ -194,6 +201,9 @@ sub _initialize {
|
||||
}
|
||||
}
|
||||
$depth++;
|
||||
|
||||
# TODO: Skip content of anyType / any stuff
|
||||
|
||||
return;
|
||||
},
|
||||
|
||||
@@ -229,6 +239,9 @@ sub _initialize {
|
||||
# empty characters
|
||||
$characters = q{};
|
||||
|
||||
# stop believing we're a leaf node
|
||||
$_leaf = 0;
|
||||
|
||||
# return if there's only one elment - can't set it in parent ;-)
|
||||
# but set as root element if we don't have one already.
|
||||
if (not defined $list->[-1]) {
|
||||
@@ -250,8 +263,6 @@ sub _initialize {
|
||||
|
||||
$current = pop @$list; # step up in object hierarchy
|
||||
|
||||
$_leaf = 0; # stop believing we're a leaf node
|
||||
|
||||
return;
|
||||
}
|
||||
);
|
||||
@@ -319,11 +330,11 @@ the same terms as perl itself
|
||||
|
||||
=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) $
|
||||
$LastChangedRevision: 677 $
|
||||
$LastChangedDate: 2009-05-16 00:45:18 +0200 (Sa, 16. Mai 2009) $
|
||||
$LastChangedRevision: 851 $
|
||||
$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 $
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ use XML::Parser::Expat;
|
||||
use 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 {
|
||||
my $self = shift;
|
||||
@@ -69,9 +69,9 @@ the same terms as perl itself
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: MessageStreamParser.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/Expat/MessageStreamParser.pm $
|
||||
$Id: MessageStreamParser.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -5,36 +5,51 @@ use Carp;
|
||||
use SOAP::WSDL::TypeLookup;
|
||||
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 {
|
||||
my ($self, $name, $imported, $importer, $import_namespace) = @_;
|
||||
my ( $self, $name, $imported, $importer, $import_namespace ) = @_;
|
||||
|
||||
my $targetNamespace = $importer->get_targetNamespace();
|
||||
my $push_method = "push_$name";
|
||||
my $get_method = "get_$name";
|
||||
my $default_namespace = $imported->get_xmlns()->{ '#default' };
|
||||
my $targetNamespace = $importer->get_targetNamespace();
|
||||
my $push_method = "push_$name";
|
||||
my $get_method = "get_$name";
|
||||
my $default_namespace = $imported->get_xmlns()->{'#default'};
|
||||
|
||||
no strict qw(refs);
|
||||
my $value_ref = $imported->$get_method();
|
||||
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
|
||||
if (defined ($default_namespace)) {
|
||||
if ( defined($default_namespace) ) {
|
||||
my $xmlns = $_->get_xmlns();
|
||||
|
||||
# it's a hash ref, so we can just update values
|
||||
if (! defined $xmlns->{ '#default'}) {
|
||||
$xmlns->{ '#default' } = $default_namespace;
|
||||
if ( !defined $xmlns->{'#default'} ) {
|
||||
$xmlns->{'#default'} = $default_namespace;
|
||||
}
|
||||
}
|
||||
|
||||
# fixup targetNamespace, but don't override
|
||||
$_->set_targetNamespace( $import_namespace )
|
||||
if ( ($import_namespace ne $targetNamespace) && ! $_->get_targetNamespace);
|
||||
$_->set_targetNamespace($import_namespace)
|
||||
if ( ( $import_namespace ne $targetNamespace )
|
||||
&& !$_->get_targetNamespace );
|
||||
|
||||
# update parent...
|
||||
$_->set_parent( $importer );
|
||||
$_->set_parent($importer);
|
||||
|
||||
# push elements into importing WSDL
|
||||
$importer->$push_method($_);
|
||||
@@ -43,242 +58,284 @@ sub _import_children {
|
||||
}
|
||||
|
||||
sub _import_namespace_definitions {
|
||||
my $self = shift;
|
||||
my $arg_ref = shift;
|
||||
my $importer = $arg_ref->{ importer };
|
||||
my $imported = $arg_ref->{ imported };
|
||||
my $self = shift;
|
||||
my $arg_ref = shift;
|
||||
my $importer = $arg_ref->{importer};
|
||||
my $imported = $arg_ref->{imported};
|
||||
|
||||
# import namespace definitions, too
|
||||
my $importer_ns_of = $importer->get_xmlns();
|
||||
my %xmlns_of = %{ $imported->get_xmlns() };
|
||||
my %xmlns_of = %{$imported->get_xmlns()};
|
||||
|
||||
# it's a hash ref, we can just add to.
|
||||
# TODO: check whether prefix is already taken.
|
||||
# TODO: check wheter URI is the better key.
|
||||
while (my ($prefix, $url) = each %xmlns_of) {
|
||||
$importer_ns_of->{ $prefix } = $url;
|
||||
# TODO: check whether URI is the better key.
|
||||
while ( my ( $prefix, $url ) = each %xmlns_of ) {
|
||||
if ( exists( $importer_ns_of->{$prefix} ) ) {
|
||||
|
||||
# warn "$prefix already exists";
|
||||
next;
|
||||
}
|
||||
$importer_ns_of->{$prefix} = $url;
|
||||
}
|
||||
}
|
||||
|
||||
sub xml_schema_import {
|
||||
my $self = shift;
|
||||
my $schema = shift;
|
||||
my $parser = $self->clone();
|
||||
my %attr_of = @_;
|
||||
my $import_namespace = $attr_of{ namespace };
|
||||
my $self = shift;
|
||||
my $schema = shift;
|
||||
my $parser = $self->clone();
|
||||
my %attr_of = @_;
|
||||
my $import_namespace = $attr_of{namespace};
|
||||
|
||||
if (not $attr_of{schemaLocation}) {
|
||||
warn "cannot import document for namespace >$import_namespace< without location";
|
||||
if ( not $attr_of{schemaLocation} ) {
|
||||
warn
|
||||
"cannot import document for namespace >$import_namespace< without location";
|
||||
return;
|
||||
}
|
||||
|
||||
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."
|
||||
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.";
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
# might already be imported - parse_uri just returns in this case
|
||||
return if not defined $imported;
|
||||
|
||||
$self->_import_namespace_definitions({
|
||||
importer => $schema,
|
||||
imported => $imported,
|
||||
});
|
||||
$self->_import_namespace_definitions( {
|
||||
importer => $schema,
|
||||
imported => $imported,
|
||||
} );
|
||||
|
||||
for my $name ( qw(type element group attribute attributeGroup) ) {
|
||||
$self->_import_children( $name, $imported, $schema, $import_namespace);
|
||||
for my $name (qw(type element group attribute attributeGroup)) {
|
||||
$self->_import_children( $name, $imported, $schema,
|
||||
$import_namespace );
|
||||
}
|
||||
}
|
||||
|
||||
sub wsdl_import {
|
||||
my $self = shift;
|
||||
my $definitions = shift;
|
||||
my $parser = $self->clone();
|
||||
my %attr_of = @_;
|
||||
my $import_namespace = $attr_of{ namespace };
|
||||
my $self = shift;
|
||||
my $definitions = shift;
|
||||
my $parser = $self->clone();
|
||||
my %attr_of = @_;
|
||||
my $import_namespace = $attr_of{namespace};
|
||||
|
||||
if (not $attr_of{location}) {
|
||||
warn "cannot import document for namespace >$import_namespace< without location";
|
||||
if ( not $attr_of{location} ) {
|
||||
warn
|
||||
"cannot import document for namespace >$import_namespace< without location";
|
||||
return;
|
||||
}
|
||||
|
||||
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."
|
||||
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.";
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
# might already be imported - parse_uri just returns in this case
|
||||
return if not defined $imported;
|
||||
|
||||
$self->_import_namespace_definitions({
|
||||
importer => $definitions,
|
||||
imported => $imported,
|
||||
});
|
||||
$self->_import_namespace_definitions( {
|
||||
importer => $definitions,
|
||||
imported => $imported,
|
||||
} );
|
||||
|
||||
for my $name ( qw(types message binding portType service) ) {
|
||||
$self->_import_children( $name, $imported, $definitions, $import_namespace);
|
||||
for my $name (qw(types message binding portType service)) {
|
||||
$self->_import_children( $name, $imported, $definitions,
|
||||
$import_namespace );
|
||||
}
|
||||
}
|
||||
|
||||
sub _initialize {
|
||||
my ($self, $parser) = @_;
|
||||
my ( $self, $parser ) = @_;
|
||||
|
||||
# init object data
|
||||
$self->{ parser } = $parser;
|
||||
delete $self->{ data };
|
||||
$self->{parser} = $parser;
|
||||
delete $self->{data};
|
||||
|
||||
# setup local variables for keeping temp data
|
||||
my $characters = undef;
|
||||
my $current = undef;
|
||||
my $list = []; # node list
|
||||
my $characters = undef;
|
||||
my $current = undef;
|
||||
my $list = []; # node list
|
||||
my $elementFormQualified = 1; # default for WSDLs, schema may override
|
||||
|
||||
# TODO skip non-XML Schema namespace tags
|
||||
$parser->setHandlers(
|
||||
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{};
|
||||
|
||||
my $action = SOAP::WSDL::TypeLookup->lookup(
|
||||
$parser->namespace($localname),
|
||||
$localname
|
||||
);
|
||||
my $action =
|
||||
SOAP::WSDL::TypeLookup->lookup( $parser->namespace($localname),
|
||||
$localname );
|
||||
|
||||
return if not $action;
|
||||
|
||||
if ($action->{ type } eq 'CLASS') {
|
||||
if ( $action->{type} eq 'CLASS' ) {
|
||||
eval "require $action->{ class }";
|
||||
croak $@ if ($@);
|
||||
|
||||
my $obj = $action->{ class }->new({ parent => $current,
|
||||
# xmlns => { '#default' => $parser->namespace($localname) }
|
||||
})
|
||||
->init( _fixup_attrs( $parser, %attrs ) );
|
||||
my $obj = $action->{class}->new( {
|
||||
parent => $current,
|
||||
namespace => $parser->namespace($localname),
|
||||
defined($current)
|
||||
? ( xmlns => $current->get_xmlns() )
|
||||
: ()} )->init( _fixup_attrs( $parser, @attrs ) );
|
||||
|
||||
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
|
||||
$obj->set_targetNamespace( $current->get_targetNamespace() )
|
||||
if not $obj->get_targetNamespace();
|
||||
if ($elementFormQualified) {
|
||||
$obj->set_targetNamespace(
|
||||
$current->get_targetNamespace() )
|
||||
if not $obj->get_targetNamespace();
|
||||
}
|
||||
|
||||
# push on parent's element/type list
|
||||
my $method = "push_$localname";
|
||||
|
||||
no strict qw(refs);
|
||||
$current->$method( $obj );
|
||||
$current->$method($obj);
|
||||
|
||||
# remember element for stepping back
|
||||
push @{ $list }, $current;
|
||||
}
|
||||
else {
|
||||
$self->{ data } = $obj;
|
||||
push @{$list}, $current;
|
||||
}
|
||||
|
||||
# set new element (step down)
|
||||
$current = $obj;
|
||||
}
|
||||
elsif ($action->{ type } eq 'PARENT') {
|
||||
$current->init( _fixup_attrs($parser, %attrs) );
|
||||
elsif ( $action->{type} eq 'PARENT' ) {
|
||||
$current->init( _fixup_attrs( $parser, @attrs ) );
|
||||
}
|
||||
elsif ($action->{ type } eq 'METHOD') {
|
||||
my $method = $action->{ method };
|
||||
elsif ( $action->{type} eq 'METHOD' ) {
|
||||
my $method = $action->{method};
|
||||
|
||||
no strict qw(refs);
|
||||
|
||||
# call method with
|
||||
# - default value ($action->{ value } if defined,
|
||||
# dereferencing lists
|
||||
# - the values of the elements Attributes hash
|
||||
# TODO: add namespaces declared to attributes.
|
||||
# Expat consumes them, so we have to re-add them here.
|
||||
$current->$method( defined $action->{ value }
|
||||
? ref $action->{ value }
|
||||
? @{ $action->{ value } }
|
||||
: ($action->{ value })
|
||||
: _fixup_attrs($parser, %attrs)
|
||||
);
|
||||
$current->$method(
|
||||
defined $action->{value}
|
||||
? ref $action->{value}
|
||||
? @{$action->{value}}
|
||||
: ( $action->{value} )
|
||||
: _fixup_attrs( $parser, @attrs ) );
|
||||
}
|
||||
elsif ($action->{type} eq 'HANDLER') {
|
||||
my $method = $self->can($action->{method});
|
||||
$method->($self, $current, %attrs);
|
||||
elsif ( $action->{type} eq 'HANDLER' ) {
|
||||
my $method = $self->can( $action->{method} );
|
||||
$method->( $self, $current, @attrs );
|
||||
}
|
||||
else {
|
||||
|
||||
# TODO replace by hash lookup of known namespaces.
|
||||
my $namespace = $parser->namespace($localname) || q{};
|
||||
my $part = $namespace eq 'http://schemas.xmlsoap.org/wsdl/'
|
||||
? 'WSDL 1.1'
|
||||
: 'XML Schema';
|
||||
my $part =
|
||||
$namespace eq 'http://schemas.xmlsoap.org/wsdl/'
|
||||
? 'WSDL 1.1'
|
||||
: 'XML Schema';
|
||||
|
||||
warn "$part element <$localname> is not implemented yet"
|
||||
if ($localname !~m{ \A (:? annotation | documentation ) \z }xms );
|
||||
if ( $localname !~
|
||||
m{ \A (:? annotation | documentation ) \z }xms );
|
||||
}
|
||||
|
||||
return;
|
||||
},
|
||||
|
||||
Char => sub { $characters .= $_[1]; return; },
|
||||
Char => sub { $characters .= $_[1]; return; },
|
||||
|
||||
End => sub {
|
||||
my ($parser, $localname) = @_;
|
||||
my ( $parser, $localname ) = @_;
|
||||
|
||||
my $action = SOAP::WSDL::TypeLookup->lookup(
|
||||
$parser->namespace( $localname ),
|
||||
$localname
|
||||
) || {};
|
||||
my $action =
|
||||
SOAP::WSDL::TypeLookup->lookup( $parser->namespace($localname),
|
||||
$localname )
|
||||
|| {};
|
||||
|
||||
return if not ($action->{ type });
|
||||
if ( $action->{ type } eq 'CLASS' ) {
|
||||
$current = pop @{ $list };
|
||||
if ( !defined $list->[-1] ) {
|
||||
$self->{data} = $current;
|
||||
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
|
||||
$characters =~s{ ^ \s+ (.+) \s+ $ }{$1}xms;
|
||||
$characters =~s{ \s+ }{ }xmsg;
|
||||
$characters =~ s{ ^ \s+ (.+) \s+ $ }{$1}xms;
|
||||
$characters =~ s{ \s+ }{ }xmsg;
|
||||
|
||||
no strict qw(refs);
|
||||
$current->$method( $characters );
|
||||
$current->$method($characters);
|
||||
}
|
||||
return;
|
||||
}
|
||||
);
|
||||
} );
|
||||
return $parser;
|
||||
}
|
||||
|
||||
# make attrs SAX style
|
||||
sub _fixup_attrs {
|
||||
my ($parser, %attrs_of) = @_;
|
||||
my ( $parser, @attrs ) = @_;
|
||||
|
||||
my @attrs_from = map {
|
||||
$_ =
|
||||
{
|
||||
Name => $_,
|
||||
Value => $attrs_of{ $_ },
|
||||
LocalName => $_
|
||||
}
|
||||
} keys %attrs_of;
|
||||
my @attr_key_from = ();
|
||||
my @attr_value_from = ();
|
||||
|
||||
while (@attrs) {
|
||||
push @attr_key_from, shift @attrs;
|
||||
push @attr_value_from, shift @attrs;
|
||||
}
|
||||
|
||||
my @attrs_from;
|
||||
|
||||
# add xmlns: attrs. expat eats them.
|
||||
push @attrs_from, map {
|
||||
# ignore xmlns=FOO namespaces - must be XML schema
|
||||
# # Other nodes should be ignored somewhere else
|
||||
# ($_ eq '#default')
|
||||
# ? ()
|
||||
# :
|
||||
{
|
||||
Name => "xmlns:$_",
|
||||
Value => $parser->expand_ns_prefix( $_ ),
|
||||
#
|
||||
# add namespaces before attributes: Attributes may be namespace-qualified
|
||||
#
|
||||
push @attrs_from, map { {
|
||||
Name => "xmlns:$_",
|
||||
Value => $parser->expand_ns_prefix($_),
|
||||
LocalName => $_
|
||||
}
|
||||
} $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;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
@@ -310,11 +367,11 @@ the same terms as perl itself
|
||||
|
||||
=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) $
|
||||
$LastChangedRevision: 677 $
|
||||
$LastChangedDate: 2009-05-16 00:45:18 +0200 (Sa, 16. Mai 2009) $
|
||||
$LastChangedRevision: 851 $
|
||||
$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 $
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Deserializer;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
my %DESERIALIZER = (
|
||||
'1.1' => 'SOAP::WSDL::Deserializer::XSD',
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Generator;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
my %GENERATOR = (
|
||||
'XSD' => 'SOAP::WSDL::Generator::Template::XSD',
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Serializer;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
my %SERIALIZER = (
|
||||
'1.1' => 'SOAP::WSDL::Serializer::XSD',
|
||||
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Serializer.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/Factory/Serializer.pm $
|
||||
$Id: Serializer.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package SOAP::WSDL::Factory::Transport;
|
||||
use strict;
|
||||
use warnings;
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
my %registered_transport_of = ();
|
||||
|
||||
@@ -39,7 +39,7 @@ sub get_transport {
|
||||
|
||||
if (defined $registered_transport_of{ $scheme }) {
|
||||
no strict qw(refs);
|
||||
defined %{ "$registered_transport_of{ $scheme }::" } or
|
||||
$registered_transport_of{ $scheme }->can('new') or
|
||||
eval "require $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);
|
||||
# behaves interestingly different under different versions of perl
|
||||
# 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 last SOAP_Lite;
|
||||
|
||||
my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
|
||||
# may fail if it's not available
|
||||
my $transport = eval { $protocol_class->new( %attrs ) }
|
||||
or last SOAP_Lite;
|
||||
@@ -74,7 +74,7 @@ sub get_transport {
|
||||
|
||||
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
|
||||
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 die "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@";
|
||||
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
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Transport.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/Factory/Transport.pm $
|
||||
$Id: Transport.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Generator::Iterator::WSDL11;
|
||||
use strict; use warnings;
|
||||
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 %nodes_of :ATTR(:name<nodes> :default<[]>);
|
||||
@@ -73,8 +73,10 @@ my %METHOD_OF = (
|
||||
$node->get_type()
|
||||
? do {
|
||||
die "unsupported global type <"
|
||||
. $node->get_type . "> found in part ". $node->get_name();
|
||||
$types->find_type( $node->expand($node->get_type) )
|
||||
. $node->get_type . "> found in part <". $node->get_name() . ">\n"
|
||||
. "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()
|
||||
|
||||
@@ -3,7 +3,7 @@ use strict; use warnings;
|
||||
|
||||
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_map_of :ATTR(:name<namespace_map> :default<{}>);
|
||||
@@ -128,7 +128,7 @@ You cannot suffix your types by some rule yet...
|
||||
|
||||
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
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package SOAP::WSDL::Generator::Template;
|
||||
use strict;
|
||||
use Template;
|
||||
use strict; use warnings;
|
||||
use Template 2.18;
|
||||
use Class::Std::Fast::Storable;
|
||||
use Carp;
|
||||
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 %definitions_of :ATTR(:name<definitions> :default<()>);
|
||||
@@ -39,7 +39,8 @@ sub _process :PROTECTED {
|
||||
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
|
||||
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
|
||||
PLUGIN_BASE => 'SOAP::WSDL::Generator::Template::Plugin',
|
||||
);
|
||||
)
|
||||
or die Template->error();
|
||||
|
||||
$tt->process( $template,
|
||||
{
|
||||
@@ -68,4 +69,40 @@ sub _process :PROTECTED {
|
||||
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 $
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@ use strict;
|
||||
use warnings;
|
||||
use Carp qw(confess);
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
use Scalar::Util qw(blessed);
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_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 @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') ) {
|
||||
NAMES: while ($parent = $parent->get_parent()) {
|
||||
$top_node = $parent;
|
||||
@@ -141,9 +143,13 @@ sub create_subpackage_name {
|
||||
}
|
||||
}
|
||||
# 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 $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;
|
||||
}
|
||||
|
||||
@@ -155,6 +161,8 @@ sub element_name {
|
||||
my $self = shift;
|
||||
my $element = shift;
|
||||
|
||||
confess "no element object" unless blessed $element;
|
||||
|
||||
my $name = $element->get_name();
|
||||
if (! $name) {
|
||||
while (my $ref = $element->get_ref()) {
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
package SOAP::WSDL::Generator::Template::XSD;
|
||||
use strict;
|
||||
use Template;
|
||||
use strict; use warnings;
|
||||
use Template 2.18;
|
||||
use Class::Std::Fast::Storable;
|
||||
use File::Basename;
|
||||
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::Typelib;
|
||||
use SOAP::WSDL::Generator::Template::Plugin::XSD;
|
||||
use base qw(SOAP::WSDL::Generator::Template);
|
||||
|
||||
my %output_of :ATTR(:name<output> :default<()>);
|
||||
my %typemap_of :ATTR(:name<typemap> :default<({})>);
|
||||
my %silent_of :ATTR(:name<silent> :default<0>);
|
||||
|
||||
sub BUILD {
|
||||
my ($self, $ident, $arg_ref) = @_;
|
||||
@@ -113,7 +113,8 @@ sub _generate_interface {
|
||||
$service,
|
||||
$port,
|
||||
));
|
||||
print "Creating interface class $output\n";
|
||||
print "Creating interface class $output\n"
|
||||
if not $silent_of{ident $self};
|
||||
|
||||
$self->_process($template_name,
|
||||
{
|
||||
@@ -173,7 +174,8 @@ sub generate_typemap {
|
||||
my $output = $arg_ref->{ output }
|
||||
? $arg_ref->{ output }
|
||||
: $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',
|
||||
{
|
||||
service => $service,
|
||||
@@ -205,6 +207,8 @@ sub visit_XSD_Element {
|
||||
my $output = defined $output_of{ ident $self }
|
||||
? $output_of{ ident $self }
|
||||
: $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);
|
||||
}
|
||||
|
||||
@@ -213,6 +217,8 @@ sub visit_XSD_SimpleType {
|
||||
my $output = defined $output_of{ ident $self }
|
||||
? $output_of{ ident $self }
|
||||
: $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);
|
||||
}
|
||||
|
||||
@@ -221,7 +227,111 @@ sub visit_XSD_ComplexType {
|
||||
my $output = defined $output_of{ ident $self }
|
||||
? $output_of{ ident $self }
|
||||
: $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);
|
||||
}
|
||||
|
||||
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 $
|
||||
|
||||
|
||||
@@ -4,6 +4,16 @@
|
||||
|
||||
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||
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 %] );
|
||||
|
||||
@@ -7,7 +7,6 @@ our [% USE Dumper(varname = 'typemap_'); Dumper.dump( typemap ) %];
|
||||
|
||||
sub get_class {
|
||||
my $name = join '/', @{ $_[1] };
|
||||
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||
return $typemap_1->{ $name };
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
[% USE XSD -%]
|
||||
[% USE XSD;
|
||||
USE Dumper -%]
|
||||
package [% XSD.create_xsd_name(complexType) %];
|
||||
use strict;
|
||||
use warnings;
|
||||
@@ -8,6 +9,12 @@ use warnings;
|
||||
# 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 %]
|
||||
|
||||
1;
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
[% IF (complexType.get_variety == 'restriction');
|
||||
[% IF (complexType.get_derivation == 'restriction');
|
||||
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";
|
||||
%]
|
||||
# No documentation generated for complexContent / extension yet
|
||||
[%
|
||||
ELSE;
|
||||
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
||||
THROW UNKNOWN, "unknown derivation ${ complexType.get_derivation }";
|
||||
END;
|
||||
|
||||
%]
|
||||
@@ -30,14 +30,17 @@ __PACKAGE__->_factory(
|
||||
{
|
||||
[% FOREACH element = complexType.get_element;
|
||||
IF (ref = element.get_ref);
|
||||
element = definitions.first_types.find_element(element.expand( element.get_ref ));
|
||||
END;
|
||||
IF (type = element.get_type);
|
||||
ref_element = definitions.first_types.find_element(element.expand( ref ));
|
||||
-%]
|
||||
'[% 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 ));
|
||||
IF (! element_type);
|
||||
type_name = complexType.expand( type );
|
||||
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) %]',
|
||||
[% ELSE;
|
||||
IF (element.first_simpleType);
|
||||
|
||||
@@ -7,6 +7,10 @@ ELSIF (complexType.get_variety == 'sequence');
|
||||
ELSIF (complexType.get_variety == 'all');
|
||||
INCLUDE complexType/extension.tt(complexType = complexType);
|
||||
ELSE;
|
||||
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
||||
IF (complexType.get_variety);
|
||||
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
||||
ELSE -%]
|
||||
# empty variety
|
||||
[% END;
|
||||
END;
|
||||
%]
|
||||
@@ -22,7 +22,7 @@ element_list = [];
|
||||
|
||||
# copy complexType ref
|
||||
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 );
|
||||
|
||||
# add a use base for first to setup inheritance
|
||||
@@ -31,13 +31,17 @@ use base qw([% XSD.create_xsd_name( base_type ) %]);
|
||||
[%
|
||||
# loop forever
|
||||
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...
|
||||
FOREACH element = base_type.get_element.reverse;
|
||||
element_list.unshift(element);
|
||||
END;
|
||||
|
||||
# get next base type
|
||||
IF (base_name=base_type.expand( base_type.get_base ));
|
||||
# get next base type if there is one...
|
||||
IF (base_type.get_base);
|
||||
base_name=base_type.expand( base_type.get_base );
|
||||
# set new base_type
|
||||
base_type = definitions.first_types.find_type( base_name );
|
||||
ELSE;
|
||||
@@ -59,8 +63,11 @@ END;
|
||||
|
||||
# set derived element list
|
||||
# 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);
|
||||
|
||||
# restore original element list
|
||||
|
||||
@@ -76,6 +76,38 @@ Perl data type class for the XML Schema defined 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
|
||||
|
||||
[% head2 %] new
|
||||
|
||||
@@ -4,11 +4,11 @@ use base qw(
|
||||
[%
|
||||
base_type = definitions.get_types.0.find_type(simpleType.expand(base));
|
||||
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;
|
||||
XSD.create_xsd_name(base_type) %]);
|
||||
[% ELSIF (type = simpleType.first_simpleType() );
|
||||
INCLUDE simpleType/atomicType.tt(type = type);
|
||||
ELSE;
|
||||
THROW "neither base nor atomic type - don't know what to do" %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
@@ -3,7 +3,7 @@ use strict;
|
||||
use warnings;
|
||||
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 %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -5,7 +5,7 @@ use Class::Std::Fast::Storable;
|
||||
|
||||
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 %typemap_of :ATTR(:name<typemap> :default<()>);
|
||||
@@ -182,3 +182,39 @@ sub visit_XSD_ComplexType {
|
||||
}
|
||||
|
||||
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 $
|
||||
|
||||
|
||||
@@ -58,8 +58,7 @@ typemaps. For every Web service, there's also a typemap created.
|
||||
|
||||
=head2 Interface class creation
|
||||
|
||||
To create interface classes, follow the steps above from
|
||||
L<Quick walk-through for the unpatient|Quick walk-through for the unpatient>.
|
||||
To create interface classes, follow the steps above.
|
||||
|
||||
If this works fine for you, skip the next paragraphs. If not, read on.
|
||||
|
||||
|
||||
91
lib/SOAP/WSDL/Manual/CodeFirst.pod
Normal file
91
lib/SOAP/WSDL/Manual/CodeFirst.pod
Normal 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;
|
||||
@@ -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
|
||||
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
|
||||
|
||||
@@ -32,6 +32,28 @@ this backend:
|
||||
|
||||
=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
|
||||
by basic or digest authentication, you also need to enforce connection
|
||||
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
|
||||
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
|
||||
|
||||
You need Crypt::SSLeay installed to access HTTPS webservices.
|
||||
@@ -112,12 +185,82 @@ or nil elements):
|
||||
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
|
||||
|
||||
Copyright 2008 Martin Kutter.
|
||||
Copyright 2008, 2009 Martin Kutter.
|
||||
|
||||
This library is free software. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -130,4 +273,4 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
$Id: $
|
||||
$HeadURL: $
|
||||
|
||||
=cut
|
||||
=cut
|
||||
|
||||
@@ -93,7 +93,7 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
$Rev: 391 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Glossary.pod 391 2007-11-17 21:56:13Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Glossary.pod $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Glossary.pod $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -241,7 +241,7 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
$Rev: 391 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Parser.pod 391 2007-11-17 21:56:13Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Parser.pod $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Parser.pod $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -1255,7 +1255,7 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
$Rev: 562 $
|
||||
$LastChangedBy: 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
|
||||
|
||||
|
||||
@@ -90,10 +90,8 @@ can just say
|
||||
|
||||
Of course this will only work if MyTypes::NewType has a superset of the old
|
||||
object class' elements.
|
||||
.
|
||||
|
||||
Future versions will restrict the data returned to the child element's data -
|
||||
you should not expect XML attributes to be returned through hash refs.
|
||||
Note that XML attribute data is not included in the hash ref output yet.
|
||||
|
||||
=head1 HOW IT WORKS
|
||||
|
||||
@@ -405,7 +403,7 @@ supported (yet).
|
||||
|
||||
=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
|
||||
implemented in L<SOAP::WSDL::Expat::WSDLParser|SOAP::WSDL::Expat::WSDLParser>,
|
||||
so alternative parsers may or may not support the import element.
|
||||
|
||||
@@ -4,7 +4,7 @@ use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
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<[]>);
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
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 %header_of :ATTR(:name<header> :default<[]>);
|
||||
|
||||
@@ -4,7 +4,7 @@ use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
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 %input_of :ATTR(:name<input> :default<[]>);
|
||||
|
||||
@@ -6,7 +6,7 @@ use Class::Std::Fast::Storable;
|
||||
|
||||
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 %type_of :ATTR(:name<type> :default<()>);
|
||||
|
||||
@@ -4,7 +4,7 @@ use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
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 %address_of :ATTR(:name<address> :default<()>);
|
||||
|
||||
@@ -2,33 +2,26 @@ package SOAP::WSDL::PortType;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
use List::Util;
|
||||
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 %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 = (
|
||||
operation => \%operation_of,
|
||||
);
|
||||
|
||||
# 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];
|
||||
};
|
||||
}
|
||||
sub find_operation {
|
||||
return List::Util::first {
|
||||
( $_->get_targetNamespace() eq $_[1] ) && ( $_->get_name() eq $_[2] )
|
||||
} @{ $operation_of{ ${ $_[0] } } };
|
||||
};
|
||||
|
||||
1;
|
||||
|
||||
@@ -4,7 +4,7 @@ use warnings;
|
||||
use base qw(SOAP::WSDL::Base);
|
||||
use Class::Std::Fast::Storable;
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
my %location :ATTR(:name<location> :default<()>);
|
||||
1;
|
||||
@@ -4,7 +4,7 @@ use warnings;
|
||||
use base qw(SOAP::WSDL::Base);
|
||||
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 %namespace_of :ATTR(:name<namespace> :default<q{}>);
|
||||
|
||||
@@ -4,7 +4,7 @@ use warnings;
|
||||
use base qw(SOAP::WSDL::Base);
|
||||
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 %namespace_of :ATTR(:name<namespace> :default<q{}>);
|
||||
|
||||
@@ -3,6 +3,6 @@ use strict;
|
||||
use warnings;
|
||||
use base qw(SOAP::WSDL::Header);
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
1;
|
||||
@@ -4,7 +4,7 @@ use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
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 %soapAction_of :ATTR(:name<soapAction> :default<()>);
|
||||
|
||||
8
lib/SOAP/WSDL/SOAP/Typelib/Fault.pm
Normal file
8
lib/SOAP/WSDL/SOAP/Typelib/Fault.pm
Normal 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;
|
||||
@@ -1,51 +1,102 @@
|
||||
package SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
{
|
||||
use strict;
|
||||
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 SOAP::WSDL::XSD::Typelib::Element;
|
||||
use Scalar::Util qw(blessed);
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
||||
use SOAP::WSDL::XSD::Typelib::Element;
|
||||
|
||||
my %faultcode_of :ATTR(:get<faultcode>);
|
||||
my %faultstring_of :ATTR(:get<faultstring>);
|
||||
my %faultactor_of :ATTR(:get<faultactor>);
|
||||
my %detail_of :ATTR(:get<detail>);
|
||||
use base qw(
|
||||
SOAP::WSDL::SOAP::Typelib::Fault
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[ qw(faultcode faultstring faultactor detail) ],
|
||||
{
|
||||
faultcode => \%faultcode_of,
|
||||
faultstring => \%faultstring_of,
|
||||
faultactor => \%faultactor_of,
|
||||
detail => \%detail_of,
|
||||
},
|
||||
{
|
||||
faultcode => 'SOAP::WSDL::XSD::Typelib::Builtin::QName',
|
||||
faultstring => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
faultactor => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||
detail => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType',
|
||||
my %faultcode_of : ATTR(:get<faultcode>);
|
||||
my %faultstring_of : ATTR(:get<faultstring>);
|
||||
my %faultactor_of : ATTR(:get<faultactor>);
|
||||
my %detail_of : ATTR(:get<detail>);
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[qw(faultcode faultstring faultactor detail)],
|
||||
{
|
||||
faultcode => \%faultcode_of,
|
||||
faultstring => \%faultstring_of,
|
||||
faultactor => \%faultactor_of,
|
||||
detail => \%detail_of,
|
||||
},
|
||||
{
|
||||
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');
|
||||
__PACKAGE__->__set_nillable();
|
||||
__PACKAGE__->__set_minOccurs();
|
||||
__PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref('');
|
||||
# BLOCK to scope warnings
|
||||
{
|
||||
no warnings qw(redefine);
|
||||
my $set_detail_sub = \&set_detail;
|
||||
*set_detail = sub {
|
||||
my ( $self, $detail ) = @_;
|
||||
|
||||
# always return false in boolean context - a fault is never true...
|
||||
sub as_bool : BOOLIFY { return; }
|
||||
# create SOAP::WSDL::SOAP::Typelib::Fault11Detail wrapper if there
|
||||
# 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;
|
||||
|
||||
=pod
|
||||
@@ -88,6 +139,16 @@ Getter/setter for object's faultactor 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
|
||||
|
||||
Copyright 2007 Martin Kutter. All rights reserved.
|
||||
@@ -101,10 +162,10 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Fault11.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/SOAP/Typelib/Fault11.pm $
|
||||
$Id: Fault11.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
use Scalar::Util qw(blessed);
|
||||
|
||||
use version; our $VERSION = qv('2.00.03');
|
||||
our $VERSION = $SOAP::WSDL::VERSION;
|
||||
|
||||
use SOAP::WSDL::Factory::Serializer;
|
||||
|
||||
@@ -30,10 +30,11 @@ sub serialize {
|
||||
my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS };
|
||||
|
||||
# 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\" ";
|
||||
}
|
||||
#
|
||||
@@ -50,7 +51,7 @@ sub serialize {
|
||||
}
|
||||
|
||||
sub serialize_header {
|
||||
my ($self, $name, $data, $opt) = @_;
|
||||
my ($self, $method, $data, $opt) = @_;
|
||||
|
||||
# header is optional. Leave out if there's no header data
|
||||
return q{} if not $data;
|
||||
@@ -62,8 +63,11 @@ sub serialize_header {
|
||||
}
|
||||
|
||||
sub serialize_body {
|
||||
my ($self, $name, $data, $opt) = @_;
|
||||
$data->__set_name("$opt->{prefix}:$name") if $opt->{prefix};
|
||||
my ($self, $method, $data, $opt) = @_;
|
||||
|
||||
# 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
|
||||
# if we have no data.
|
||||
@@ -129,10 +133,10 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 677 $
|
||||
$Rev: 851 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: XSD.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/Serializer/XSD.pm $
|
||||
$Id: XSD.pm 851 2009-05-15 22:45:18Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ use Scalar::Util qw(blessed);
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
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 %action_map_ref_of :ATTR(:name<action_map_ref> :default<{}>);
|
||||
@@ -42,7 +42,7 @@ sub handle {
|
||||
};
|
||||
if ($@) {
|
||||
die $deserializer_of{ $ident }->generate_fault({
|
||||
code => 'soap:Server',
|
||||
code => 'SOAP-ENV:Server',
|
||||
role => 'urn:localhost',
|
||||
message => "Error deserializing message: $@. \n"
|
||||
});
|
||||
@@ -65,7 +65,7 @@ sub handle {
|
||||
|
||||
if (!$dispatch_to_of{ $ident }) {
|
||||
die $deserializer_of{ $ident }->generate_fault({
|
||||
code => 'soap:Server',
|
||||
code => 'SOAP-ENV:Server',
|
||||
role => 'urn:localhost',
|
||||
message => "No handler registered",
|
||||
});
|
||||
@@ -73,7 +73,7 @@ sub handle {
|
||||
|
||||
if (! defined $request->header('SOAPAction') ) {
|
||||
die $deserializer_of{ $ident }->generate_fault({
|
||||
code => 'soap:Server',
|
||||
code => 'SOAP-ENV:Server',
|
||||
role => 'urn:localhost',
|
||||
message => "Not found: No SOAPAction given",
|
||||
});
|
||||
@@ -81,7 +81,7 @@ sub handle {
|
||||
|
||||
if (! defined $method_name) {
|
||||
die $deserializer_of{ $ident }->generate_fault({
|
||||
code => 'soap:Server',
|
||||
code => 'SOAP-ENV:Server',
|
||||
role => 'urn:localhost',
|
||||
message => "Not found: No method found for the SOAPAction '$soap_action'",
|
||||
});
|
||||
@@ -92,7 +92,7 @@ sub handle {
|
||||
|
||||
if (!$method_ref) {
|
||||
die $deserializer_of{ $ident }->generate_fault({
|
||||
code => 'soap:Server',
|
||||
code => 'SOAP-ENV:Server',
|
||||
role => 'urn:localhost',
|
||||
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();
|
||||
|
||||
die $soap->get_deserializer()->generate_fault({
|
||||
code => 'soap:Server',
|
||||
code => 'SOAP-ENV:Server',
|
||||
role => 'urn:localhost',
|
||||
message => "The error message to pas back",
|
||||
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
|
||||
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
|
||||
|
||||
Copyright 2004-2008 Martin Kutter.
|
||||
|
||||
@@ -2,6 +2,8 @@ package SOAP::WSDL::Server::CGI;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Encode;
|
||||
|
||||
use HTTP::Request;
|
||||
use HTTP::Response;
|
||||
use HTTP::Status;
|
||||
@@ -12,7 +14,7 @@ use Class::Std::Fast::Storable;
|
||||
|
||||
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
|
||||
# server directly - we would have to swap out it's base class...
|
||||
@@ -80,7 +82,7 @@ sub handle {
|
||||
else {
|
||||
$response = HTTP::Response->new(200);
|
||||
$response->header('Content-type' => 'text/xml; charset="utf-8"');
|
||||
$response->content( $response_message );
|
||||
$response->content( encode('utf8', $response_message ) );
|
||||
{
|
||||
use bytes;
|
||||
$response->header('Content-length', length $response_message);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user