Compare commits

...
4 Commits
Author SHA1 Message Date
Martin Kutter 51db446428 import SOAP-WSDL 2.00_32 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_32
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_32.tar.gz
2009-12-12 19:48:24 -08:00
Martin Kutter f0b3bdc201 import SOAP-WSDL 2.00_31 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_31
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_31.tar.gz
2009-12-12 19:48:21 -08:00
Martin Kutter 874251225f import SOAP-WSDL 2.00_29 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_29
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_29.tar.gz
2009-12-12 19:48:17 -08:00
Martin Kutter 2bad767211 import SOAP-WSDL 1.27 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  1.27
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-1.27.tar.gz
2009-12-12 19:48:16 -08:00
107 changed files with 3674 additions and 907 deletions
+2 -1
View File
@@ -5,7 +5,7 @@ $build = Module::Build->new(
create_makefile_pl => 'passthrough', create_makefile_pl => 'passthrough',
dist_abstract => 'SOAP with WSDL support', dist_abstract => 'SOAP with WSDL support',
dist_name => 'SOAP-WSDL', dist_name => 'SOAP-WSDL',
dist_version => '2.00_28', dist_version => '2.00_32',
module_name => 'SOAP::WSDL', module_name => 'SOAP::WSDL',
license => 'artistic', license => 'artistic',
requires => { requires => {
@@ -24,6 +24,7 @@ $build = Module::Build->new(
'LWP::UserAgent' => 0, 'LWP::UserAgent' => 0,
'Template' => 0, 'Template' => 0,
'Term::ReadKey' => 0, 'Term::ReadKey' => 0,
'URI' => 0,
'XML::Parser::Expat' => 0, 'XML::Parser::Expat' => 0,
}, },
buildrequires => { buildrequires => {
+80 -1
View File
@@ -1,4 +1,4 @@
Release notes for SOAP::WSDL 2.00_28 Release notes for SOAP::WSDL 2.00_32
------- -------
I'm proud to present a new pre-release version of SOAP::WSDL. I'm proud to present a new pre-release version of SOAP::WSDL.
@@ -34,6 +34,85 @@ Features:
The following changes have been made: The following changes have been made:
2.00_32
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1893147 ] Segfault on 2.0.0_31
The following uncategorized improvements have been made:
* changed SOAP::WSDL::XSD::ComplexType's set_/get_flavor methods to
set_/get_variety to reflect the XML standard more closely.
get_flavor is retained for compatibility reasons.
* added initial support for complexType/simpleContent definitions. Right
now, only restriction derivations are supported.
* fixed an error in the generator_test.wsdl
2.00_31 - Feb 11 2007
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1883843 ] Support wsdl:import
* [ 1883863 ] Support xsd:import
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
The following uncategorized improvements have been made:
* The WSDL Parser now warns about unsupported WSDL / XML schema elements
* Fixed path handling in t/006_client.t
* Removed useless ms regex flag in SOAP::WSDL::Factory::Transport
* The test suite has been improved
2.00_30 - unreleased
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1875288 ] Support XML attributes (partial)
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1876435 ] Test on perl-5.10 fails
* #32611 empty complexType structure classes are missing 'use Class::Std::Fast::Storable'
The following uncategorized improvements have been made:
* ComplexType objects now accept { foo => undef } in constructor and handle
it as non-present child element foo.
* Updated test suite
* Updated SOAP::WSDL::Client::Base to correctly handle SOAP calls with
no parameters (empty parts)
* Test on perl-5.10 fails when SOAP::Lite is not installed
2.00_29
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* #32188: minor bug found and fixed in WSDL generation
* [ 1871175 ] Can't delete attributes from ComplexType objects
The following uncategorized improvements have been made:
* Updated SOAP::WSDL::Manual::XSD
* Removed pod directives from templates to avoid confusing CPAN's pod
viewer
* Initial (incomplete) XML attribute support
* Updated test suite
2.00_28 2.00_28
The following bugs have been fixed (the numbers in square brackets are the The following bugs have been fixed (the numbers in square brackets are the
+26 -1
View File
@@ -2,6 +2,7 @@ benchmark/01_expat.t
benchmark/hello.pl benchmark/hello.pl
benchmark/person.pl benchmark/person.pl
benchmark/person.xml benchmark/person.xml
benchmark/person_profile.pl
benchmark/XSD/01_anyType.t benchmark/XSD/01_anyType.t
benchmark/XSD/02_anySimpleType.t benchmark/XSD/02_anySimpleType.t
benchmark/XSD/03_string.t benchmark/XSD/03_string.t
@@ -92,11 +93,13 @@ lib/SOAP/WSDL/Factory/Generator.pm
lib/SOAP/WSDL/Factory/Serializer.pm lib/SOAP/WSDL/Factory/Serializer.pm
lib/SOAP/WSDL/Factory/Transport.pm lib/SOAP/WSDL/Factory/Transport.pm
lib/SOAP/WSDL/Generator/Template.pm lib/SOAP/WSDL/Generator/Template.pm
lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
lib/SOAP/WSDL/Generator/Template/XSD.pm lib/SOAP/WSDL/Generator/Template/XSD.pm
lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/attributeSet.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
@@ -104,8 +107,10 @@ lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/simpleContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/simpleContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt
lib/SOAP/WSDL/Generator/Template/XSD/element.tt lib/SOAP/WSDL/Generator/Template/XSD/element.tt
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt
@@ -164,12 +169,15 @@ lib/SOAP/WSDL/Transport/Loopback.pm
lib/SOAP/WSDL/Transport/Test.pm lib/SOAP/WSDL/Transport/Test.pm
lib/SOAP/WSDL/TypeLookup.pm lib/SOAP/WSDL/TypeLookup.pm
lib/SOAP/WSDL/Types.pm lib/SOAP/WSDL/Types.pm
lib/SOAP/WSDL/XSD/Attribute.pm
lib/SOAP/WSDL/XSD/Builtin.pm lib/SOAP/WSDL/XSD/Builtin.pm
lib/SOAP/WSDL/XSD/ComplexType.pm lib/SOAP/WSDL/XSD/ComplexType.pm
lib/SOAP/WSDL/XSD/Element.pm lib/SOAP/WSDL/XSD/Element.pm
lib/SOAP/WSDL/XSD/Schema.pm lib/SOAP/WSDL/XSD/Schema.pm
lib/SOAP/WSDL/XSD/Schema/Builtin.pm lib/SOAP/WSDL/XSD/Schema/Builtin.pm
lib/SOAP/WSDL/XSD/SimpleType.pm lib/SOAP/WSDL/XSD/SimpleType.pm
lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
@@ -240,6 +248,7 @@ t/013_complexType.t
t/016_client_object.t t/016_client_object.t
t/017_generator.t t/017_generator.t
t/020_storable.t t/020_storable.t
t/095_copying.t
t/096_characters.t t/096_characters.t
t/097_kwalitee.t t/097_kwalitee.t
t/098_pod.t t/098_pod.t
@@ -267,15 +276,22 @@ t/acceptance/wsdl/10_helloworld.asmx.xml
t/acceptance/wsdl/11_helloworld.wsdl t/acceptance/wsdl/11_helloworld.wsdl
t/acceptance/wsdl/contributed/Axis.wsdl t/acceptance/wsdl/contributed/Axis.wsdl
t/acceptance/wsdl/contributed/ETest.wsdl t/acceptance/wsdl/contributed/ETest.wsdl
t/acceptance/wsdl/contributed/gasquery.wsdl
t/acceptance/wsdl/contributed/OITest.wsdl t/acceptance/wsdl/contributed/OITest.wsdl
t/acceptance/wsdl/contributed/tools.wsdl t/acceptance/wsdl/contributed/tools.wsdl
t/acceptance/wsdl/elementAtomicComplexType.xml t/acceptance/wsdl/elementAtomicComplexType.xml
t/acceptance/wsdl/email_account.wsdl t/acceptance/wsdl/email_account.wsdl
t/acceptance/wsdl/generator_test.wsdl t/acceptance/wsdl/generator_test.wsdl
t/acceptance/wsdl/generator_test_dot_names.wsdl
t/acceptance/wsdl/generator_unsupported_test.wsdl t/acceptance/wsdl/generator_unsupported_test.wsdl
t/acceptance/wsdl/import.xsd
t/acceptance/wsdl/import_loop.xsd
t/acceptance/wsdl/message_gateway.wsdl t/acceptance/wsdl/message_gateway.wsdl
t/acceptance/wsdl/WSDLParser-import.wsdl
t/acceptance/wsdl/WSDLParser-imported.wsdl
t/acceptance/wsdl/WSDLParser.wsdl
t/acceptance/wsdl/WSDLParser_import_loop.wsdl
t/contributed.wsdl t/contributed.wsdl
t/Expat/01_expat.t
t/Expat/03_wsdl.t t/Expat/03_wsdl.t
t/lib/MyComplexType.pm t/lib/MyComplexType.pm
t/lib/MyElement.pm t/lib/MyElement.pm
@@ -303,11 +319,15 @@ t/SOAP/WSDL/05_simpleType-union.t
t/SOAP/WSDL/06_keep_alive.t t/SOAP/WSDL/06_keep_alive.t
t/SOAP/WSDL/11_helloworld.NET.t t/SOAP/WSDL/11_helloworld.NET.t
t/SOAP/WSDL/12_binding.t t/SOAP/WSDL/12_binding.t
t/SOAP/WSDL/Client.t
t/SOAP/WSDL/Client/Base.t t/SOAP/WSDL/Client/Base.t
t/SOAP/WSDL/Definitions.t
t/SOAP/WSDL/Deserializer/Hash.t t/SOAP/WSDL/Deserializer/Hash.t
t/SOAP/WSDL/Deserializer/SOM.t t/SOAP/WSDL/Deserializer/SOM.t
t/SOAP/WSDL/Deserializer/XSD.t t/SOAP/WSDL/Deserializer/XSD.t
t/SOAP/WSDL/Expat/Base.t t/SOAP/WSDL/Expat/Base.t
t/SOAP/WSDL/Expat/MessageParser.t
t/SOAP/WSDL/Expat/WSDLParser.t
t/SOAP/WSDL/Factory/Deserializer.t t/SOAP/WSDL/Factory/Deserializer.t
t/SOAP/WSDL/Factory/Serializer.t t/SOAP/WSDL/Factory/Serializer.t
t/SOAP/WSDL/Factory/Transport.t t/SOAP/WSDL/Factory/Transport.t
@@ -316,8 +336,10 @@ t/SOAP/WSDL/Generator/Visitor.t
t/SOAP/WSDL/Generator/Visitor/Typemap.t t/SOAP/WSDL/Generator/Visitor/Typemap.t
t/SOAP/WSDL/Generator/XCS.t t/SOAP/WSDL/Generator/XCS.t
t/SOAP/WSDL/Generator/XSD.t t/SOAP/WSDL/Generator/XSD.t
t/SOAP/WSDL/Generator/XSD_dot_names.t
t/SOAP/WSDL/Generator/XSD_unsupported.t t/SOAP/WSDL/Generator/XSD_unsupported.t
t/SOAP/WSDL/Part.t t/SOAP/WSDL/Part.t
t/SOAP/WSDL/PortType.t
t/SOAP/WSDL/Serializer/XSD.t t/SOAP/WSDL/Serializer/XSD.t
t/SOAP/WSDL/Server.t t/SOAP/WSDL/Server.t
t/SOAP/WSDL/Server/CGI.t t/SOAP/WSDL/Server/CGI.t
@@ -326,9 +348,12 @@ t/SOAP/WSDL/Transport/02_HTTP.t
t/SOAP/WSDL/Transport/acceptance/test2.xml t/SOAP/WSDL/Transport/acceptance/test2.xml
t/SOAP/WSDL/Transport/acceptance/test3.xml t/SOAP/WSDL/Transport/acceptance/test3.xml
t/SOAP/WSDL/Typelib/Fault11.t t/SOAP/WSDL/Typelib/Fault11.t
t/SOAP/WSDL/XSD/Attribute.t
t/SOAP/WSDL/XSD/ComplexType.t t/SOAP/WSDL/XSD/ComplexType.t
t/SOAP/WSDL/XSD/Element.t t/SOAP/WSDL/XSD/Element.t
t/SOAP/WSDL/XSD/Schema.t
t/SOAP/WSDL/XSD/SimpleType.t t/SOAP/WSDL/XSD/SimpleType.t
t/SOAP/WSDL/XSD/Typelib/Attribute.t
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
+21 -7
View File
@@ -1,6 +1,6 @@
--- ---
name: SOAP-WSDL name: SOAP-WSDL
version: 2.00_28 version: 2.00_32
author: author:
- 'Martin Kutter <martin.kutter@fen-net.de>' - 'Martin Kutter <martin.kutter@fen-net.de>'
abstract: SOAP with WSDL support abstract: SOAP with WSDL support
@@ -25,12 +25,13 @@ requires:
List::Util: 0 List::Util: 0
Template: 0 Template: 0
Term::ReadKey: 0 Term::ReadKey: 0
URI: 0
XML::Parser::Expat: 0 XML::Parser::Expat: 0
perl: 5.8.0 perl: 5.8.0
provides: provides:
SOAP::WSDL: SOAP::WSDL:
file: lib/SOAP/WSDL.pm file: lib/SOAP/WSDL.pm
version: 2.00_25 version: 2.00_32
SOAP::WSDL::Base: SOAP::WSDL::Base:
file: lib/SOAP/WSDL/Base.pm file: lib/SOAP/WSDL/Base.pm
version: 2.00_27 version: 2.00_27
@@ -56,7 +57,7 @@ provides:
version: 2.00_25 version: 2.00_25
SOAP::WSDL::Expat::Base: SOAP::WSDL::Expat::Base:
file: lib/SOAP/WSDL/Expat/Base.pm file: lib/SOAP/WSDL/Expat/Base.pm
version: 2.00_27 version: 2.00_32
SOAP::WSDL::Expat::Message2Hash: SOAP::WSDL::Expat::Message2Hash:
file: lib/SOAP/WSDL/Expat/Message2Hash.pm file: lib/SOAP/WSDL/Expat/Message2Hash.pm
version: 2.00_27 version: 2.00_27
@@ -77,10 +78,12 @@ provides:
version: 2.00_24 version: 2.00_24
SOAP::WSDL::Factory::Transport: SOAP::WSDL::Factory::Transport:
file: lib/SOAP/WSDL/Factory/Transport.pm file: lib/SOAP/WSDL/Factory/Transport.pm
version: 2.00_25 version: 2.00_31
SOAP::WSDL::Generator::Template: SOAP::WSDL::Generator::Template:
file: lib/SOAP/WSDL/Generator/Template.pm file: lib/SOAP/WSDL/Generator/Template.pm
version: 2.00_25 version: 2.00_25
SOAP::WSDL::Generator::Template::Plugin::XSD:
file: lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
SOAP::WSDL::Generator::Template::XSD: SOAP::WSDL::Generator::Template::XSD:
file: lib/SOAP/WSDL/Generator/Template/XSD.pm file: lib/SOAP/WSDL/Generator/Template/XSD.pm
version: 2.00_27 version: 2.00_27
@@ -139,13 +142,17 @@ provides:
version: 2.00_25 version: 2.00_25
SOAP::WSDL::TypeLookup: SOAP::WSDL::TypeLookup:
file: lib/SOAP/WSDL/TypeLookup.pm file: lib/SOAP/WSDL/TypeLookup.pm
version: 2.00_31
SOAP::WSDL::Types: SOAP::WSDL::Types:
file: lib/SOAP/WSDL/Types.pm file: lib/SOAP/WSDL/Types.pm
SOAP::WSDL::XSD::Attribute:
file: lib/SOAP/WSDL/XSD/Attribute.pm
version: 2.00_29
SOAP::WSDL::XSD::Builtin: SOAP::WSDL::XSD::Builtin:
file: lib/SOAP/WSDL/XSD/Builtin.pm file: lib/SOAP/WSDL/XSD/Builtin.pm
SOAP::WSDL::XSD::ComplexType: SOAP::WSDL::XSD::ComplexType:
file: lib/SOAP/WSDL/XSD/ComplexType.pm file: lib/SOAP/WSDL/XSD/ComplexType.pm
version: 2.00_25 version: 2.00_29
SOAP::WSDL::XSD::Element: SOAP::WSDL::XSD::Element:
file: lib/SOAP/WSDL/XSD/Element.pm file: lib/SOAP/WSDL/XSD/Element.pm
version: 2.00_25 version: 2.00_25
@@ -157,6 +164,12 @@ provides:
SOAP::WSDL::XSD::SimpleType: SOAP::WSDL::XSD::SimpleType:
file: lib/SOAP/WSDL/XSD/SimpleType.pm file: lib/SOAP/WSDL/XSD/SimpleType.pm
version: 2.00_25 version: 2.00_25
SOAP::WSDL::XSD::Typelib::Attribute:
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
version: 2.00_29
SOAP::WSDL::XSD::Typelib::AttributeSet:
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
version: 2.00_29
SOAP::WSDL::XSD::Typelib::Builtin: SOAP::WSDL::XSD::Typelib::Builtin:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
version: 2.00_25 version: 2.00_25
@@ -184,6 +197,7 @@ provides:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
SOAP::WSDL::XSD::Typelib::Builtin::anyType: SOAP::WSDL::XSD::Typelib::Builtin::anyType:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
version: 2.00_29
SOAP::WSDL::XSD::Typelib::Builtin::anyURI: SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary: SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
@@ -256,10 +270,10 @@ provides:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
SOAP::WSDL::XSD::Typelib::ComplexType: SOAP::WSDL::XSD::Typelib::ComplexType:
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
version: 2.00_27 version: 2.00_31
SOAP::WSDL::XSD::Typelib::Element: SOAP::WSDL::XSD::Typelib::Element:
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
version: 2.00_27 version: 2.00_29
SOAP::WSDL::XSD::Typelib::SimpleType: SOAP::WSDL::XSD::Typelib::SimpleType:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
SOAP::WSDL::XSD::Typelib::SimpleType::restriction: SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
+17 -1
View File
@@ -1,7 +1,23 @@
MIGRATING MIGRATING
--------- ---------
This document describes how to migrate from 2.00_24 and before versions to MIGRATING FROM PRE-2.00_29
--------------------------
SOAP::WSDL 2.00_29 added experimental XML attribute support. The attribute
support changed the code of the generated classes, which may now
require the class SOAP::WSDL::XSD::Typelib::Attribute introduced in the same
pre-release.
While interfaces generated with pre-releases back to 2.00_25 work without
change, this does not hold true vice versa: Interfaces generated with
2.00_29 and above won't work with older pre-releases.
You'll have to update SOAP::WSDL on all your machines.
MIGRATING FROM PRE-2.00_24
--------------------------
This section describes how to migrate from 2.00_24 and before versions to
2.00_25. 2.00_25.
Migrating from 2.00_xx Migrating from 2.00_xx
+25 -53
View File
@@ -4,34 +4,10 @@ use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch'; use lib '../../SOAP-WSDL_XS/blib/arch';
use strict; use strict;
package MyData;
my $XML;
sub xml {
return $XML if ($XML);
open my $fh, 'person.xml' or die 'cannot open data file';
$XML = join '', <$fh>;
close $fh;
return $XML;
}
package MyTransport;
use SOAP::WSDL::Factory::Transport;
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
sub send_receive {
return MyData::xml();
}
sub new { return bless {}, 'MyTransport' };
package main;
use Benchmark qw(cmpthese); use Benchmark qw(cmpthese);
# Do this BEFORE the client SOAP handlers are compiled!
use XML::Compile::Transport::SOAPHTTP(); use XML::Compile::Transport::SOAPHTTP();
use XML::Compile::SOAP::Tester (); use XML::Compile::Util;
use XML::Compile::Util;#use Data::Dumper;
#print Dumper $result;
use XML::Compile::WSDL11; use XML::Compile::WSDL11;
use XML::Simple; use XML::Simple;
@@ -43,14 +19,9 @@ use SOAP::Lite;
use MyInterfaces::TestService::TestPort; use MyInterfaces::TestService::TestPort;
my $tester = XML::Compile::SOAP::Tester->new();
my $action = pack_type 'http://example.org', 'ListPerson';
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl'); my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
$tester->actionCallback($action, \&MyData::xml);
my $call = $compile->compileClient('ListPerson'); my $call = $compile->compileClient('ListPerson');
my $result = $call->({ in => undef}); $call->({ in => undef});
# Initialize SOAP::Lite # Initialize SOAP::Lite
my $deserializer = SOAP::Deserializer->new(); my $deserializer = SOAP::Deserializer->new();
@@ -60,17 +31,16 @@ my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too # Load all classes - XML::Compile has created everything before, too
$soap->ListPerson({}); $soap->ListPerson({});
my $lite = SOAP::Lite->new()->default_ns('http://www.example.org/benchmark/')
->proxy('http://localhost:81/soap-wsdl-test/person.pl');
$lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
# # register for SOAP 1.1 # # register for SOAP 1.1
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' ); SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
my $wsdl_xs = MyInterfaces::TestService::TestPort->new(); my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
# trigger loading of XML Data # trigger loading of XML Data
{ my $count = 100;
use bytes;
print "XML length (bytes): " . length( MyData::xml() ), "\n";
}
my @data = (); my @data = ();
my $n = 0; my $n = 0;
print "Benchmark conducted with print "Benchmark conducted with
@@ -78,37 +48,39 @@ SOAP::Lite - $SOAP::Lite::VERSION
SOAP::WSDL - $SOAP::WSDL::Client::VERSION SOAP::WSDL - $SOAP::WSDL::Client::VERSION
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION; SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
XML::Simple - $XML::Simple::VERSION
Benchmark $n: Store result in private variable and destroy it Benchmark $n: Store result in private variable and destroy it
"; ";
$n++; $n++;
cmpthese 300, { cmpthese $count, {
'XML::Simple' => sub { my $result = XMLin( MyData::xml() )}, # 'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) }, 'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
'XML::Compile::SOAP' => sub { my $result = $call->() }, 'XML::Compile' => sub { my $result = $call->() },
'SOAP::WSDL_XS' => sub { my $result = @data, $wsdl_xs->ListPerson({}) }, 'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )} # 'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )},
'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
}; };
print "Benchmark $n: Push result on list\n"; print "\nBenchmark $n: Push result on list\n";
$n++; $n++;
cmpthese 500, { cmpthese $count, {
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )}, # 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) }, 'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'XML::Compile::SOAP' => sub { push @data, $call->() }, 'XML::Compile' => sub { push @data, $call->() },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) }, 'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )} # 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
}; };
@data = (); @data = ();
print "Benchmark $n: Play it again, Sam\n"; print "\nBenchmark $n: Play it again, Sam\n";
cmpthese 500, { cmpthese $count, {
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )}, # 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) }, 'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) }, 'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'XML::Compile::SOAP' => sub { push @data, $call->() }, 'XML::Compile' => sub { push @data, $call->() },
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )} # 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
}; };
+222 -222
View File
@@ -46,388 +46,388 @@
</NewElement> </NewElement>
<NewElement> <NewElement>
<PersonID> <PersonID>
<ID>1</ID> <ID>2</ID>
</PersonID> </PersonID>
<Salutation>Salutation0</Salutation> <Salutation>Salutation2</Salutation>
<Name>Name0</Name> <Name>Name2</Name>
<GivenName>Martin</GivenName> <GivenName>Martin2</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth> <DateOfBirth>1970-01-02</DateOfBirth>
<HomeAddress> <HomeAddress>
<Street>Street 0</Street> <Street>Street 2</Street>
<ZIP>00000</ZIP> <ZIP>00002</ZIP>
<City>City0</City> <City>City2</City>
<Country>Country0</Country> <Country>Country2</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4900000002</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++491700000002</MobilePhoneNumber>
</HomeAddress> </HomeAddress>
<WorkAddress> <WorkAddress>
<Street>Somestreet 23</Street> <Street>Somestreet 2</Street>
<ZIP>12345</ZIP> <ZIP>222222</ZIP>
<City>SomeCity</City> <City>SomeCity2</City>
<Country>Germany</Country> <Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4920000002</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++4920000002</MobilePhoneNumber>
</WorkAddress> </WorkAddress>
<Contracts> <Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
</Contract>
<Contract> <Contract>
<ContractID>100002</ContractID> <ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName> <ContractName>SomeContract2</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100003</ContractID> <ContractID>100021</ContractID>
<ContractName>SomeContract3</ContractName> <ContractName>SomeContract21</ContractName>
</Contract>
<Contract>
<ContractID>100022</ContractID>
<ContractName>SomeContract22</ContractName>
</Contract>
<Contract>
<ContractID>1000023</ContractID>
<ContractName>SomeContract23</ContractName>
</Contract> </Contract>
</Contracts> </Contracts>
</NewElement> </NewElement>
<NewElement> <NewElement>
<PersonID> <PersonID>
<ID>1</ID> <ID>3</ID>
</PersonID> </PersonID>
<Salutation>Salutation0</Salutation> <Salutation>Salutation3</Salutation>
<Name>Name0</Name> <Name>Name3</Name>
<GivenName>Martin</GivenName> <GivenName>Martin3</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth> <DateOfBirth>1970-01-03</DateOfBirth>
<HomeAddress> <HomeAddress>
<Street>Street 0</Street> <Street>Street 3</Street>
<ZIP>00000</ZIP> <ZIP>00003</ZIP>
<City>City0</City> <City>City3</City>
<Country>Country0</Country> <Country>Country3</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4900000003</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++491700000003</MobilePhoneNumber>
</HomeAddress> </HomeAddress>
<WorkAddress> <WorkAddress>
<Street>Somestreet 23</Street> <Street>Somestreet 3</Street>
<ZIP>12345</ZIP> <ZIP>333333</ZIP>
<City>SomeCity</City> <City>SomeCity3</City>
<Country>Germany</Country> <Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4930000003</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++4930000003</MobilePhoneNumber>
</WorkAddress> </WorkAddress>
<Contracts> <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> <Contract>
<ContractID>100003</ContractID> <ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName> <ContractName>SomeContract3</ContractName>
</Contract> </Contract>
<Contract>
<ContractID>100031</ContractID>
<ContractName>SomeContract31</ContractName>
</Contract>
<Contract>
<ContractID>100033</ContractID>
<ContractName>SomeContract33</ContractName>
</Contract>
<Contract>
<ContractID>1000033</ContractID>
<ContractName>SomeContract33</ContractName>
</Contract>
</Contracts> </Contracts>
</NewElement> </NewElement>
<NewElement> <NewElement>
<PersonID> <PersonID>
<ID>1</ID> <ID>4</ID>
</PersonID> </PersonID>
<Salutation>Salutation0</Salutation> <Salutation>Salutation4</Salutation>
<Name>Name0</Name> <Name>Name4</Name>
<GivenName>Martin</GivenName> <GivenName>Martin4</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth> <DateOfBirth>1970-01-04</DateOfBirth>
<HomeAddress> <HomeAddress>
<Street>Street 0</Street> <Street>Street 4</Street>
<ZIP>00000</ZIP> <ZIP>00004</ZIP>
<City>City0</City> <City>City4</City>
<Country>Country0</Country> <Country>Country4</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4900000004</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++491700000004</MobilePhoneNumber>
</HomeAddress> </HomeAddress>
<WorkAddress> <WorkAddress>
<Street>Somestreet 23</Street> <Street>Somestreet 4</Street>
<ZIP>12345</ZIP> <ZIP>444444</ZIP>
<City>SomeCity</City> <City>SomeCity4</City>
<Country>Germany</Country> <Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4940000004</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++4940000004</MobilePhoneNumber>
</WorkAddress> </WorkAddress>
<Contracts> <Contracts>
<Contract> <Contract>
<ContractID>100000</ContractID> <ContractID>100004</ContractID>
<ContractName>SomeContract0</ContractName> <ContractName>SomeContract4</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100001</ContractID> <ContractID>100041</ContractID>
<ContractName>SomeContract1</ContractName> <ContractName>SomeContract41</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100002</ContractID> <ContractID>100044</ContractID>
<ContractName>SomeContract2</ContractName> <ContractName>SomeContract44</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100003</ContractID> <ContractID>1000044</ContractID>
<ContractName>SomeContract3</ContractName> <ContractName>SomeContract44</ContractName>
</Contract> </Contract>
</Contracts> </Contracts>
</NewElement> </NewElement>
<NewElement> <NewElement>
<PersonID> <PersonID>
<ID>1</ID> <ID>5</ID>
</PersonID> </PersonID>
<Salutation>Salutation0</Salutation> <Salutation>Salutation5</Salutation>
<Name>Name0</Name> <Name>Name5</Name>
<GivenName>Martin</GivenName> <GivenName>Martin5</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth> <DateOfBirth>1970-01-05</DateOfBirth>
<HomeAddress> <HomeAddress>
<Street>Street 0</Street> <Street>Street 5</Street>
<ZIP>00000</ZIP> <ZIP>00005</ZIP>
<City>City0</City> <City>City5</City>
<Country>Country0</Country> <Country>Country5</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4900000005</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++491700000005</MobilePhoneNumber>
</HomeAddress> </HomeAddress>
<WorkAddress> <WorkAddress>
<Street>Somestreet 23</Street> <Street>Somestreet 5</Street>
<ZIP>12345</ZIP> <ZIP>555555</ZIP>
<City>SomeCity</City> <City>SomeCity5</City>
<Country>Germany</Country> <Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4950000005</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++4950000005</MobilePhoneNumber>
</WorkAddress> </WorkAddress>
<Contracts> <Contracts>
<Contract> <Contract>
<ContractID>100000</ContractID> <ContractID>100005</ContractID>
<ContractName>SomeContract0</ContractName> <ContractName>SomeContract5</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100001</ContractID> <ContractID>100051</ContractID>
<ContractName>SomeContract1</ContractName> <ContractName>SomeContract51</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100002</ContractID> <ContractID>100055</ContractID>
<ContractName>SomeContract2</ContractName> <ContractName>SomeContract55</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100003</ContractID> <ContractID>1000053</ContractID>
<ContractName>SomeContract3</ContractName> <ContractName>SomeContract53</ContractName>
</Contract> </Contract>
</Contracts> </Contracts>
</NewElement> </NewElement>
<NewElement> <NewElement>
<PersonID> <PersonID>
<ID>1</ID> <ID>6</ID>
</PersonID> </PersonID>
<Salutation>Salutation0</Salutation> <Salutation>Salutation6</Salutation>
<Name>Name0</Name> <Name>Name6</Name>
<GivenName>Martin</GivenName> <GivenName>Martin6</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth> <DateOfBirth>1970-01-06</DateOfBirth>
<HomeAddress> <HomeAddress>
<Street>Street 0</Street> <Street>Street 6</Street>
<ZIP>00000</ZIP> <ZIP>00006</ZIP>
<City>City0</City> <City>City6</City>
<Country>Country0</Country> <Country>Country6</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4900000006</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++491700000006</MobilePhoneNumber>
</HomeAddress> </HomeAddress>
<WorkAddress> <WorkAddress>
<Street>Somestreet 23</Street> <Street>Somestreet 6</Street>
<ZIP>12345</ZIP> <ZIP>666666</ZIP>
<City>SomeCity</City> <City>SomeCity6</City>
<Country>Germany</Country> <Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4960000006</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++4960000006</MobilePhoneNumber>
</WorkAddress> </WorkAddress>
<Contracts> <Contracts>
<Contract> <Contract>
<ContractID>100000</ContractID> <ContractID>100006</ContractID>
<ContractName>SomeContract0</ContractName> <ContractName>SomeContract6</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100001</ContractID> <ContractID>100061</ContractID>
<ContractName>SomeContract1</ContractName> <ContractName>SomeContract61</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100002</ContractID> <ContractID>100066</ContractID>
<ContractName>SomeContract2</ContractName> <ContractName>SomeContract66</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100003</ContractID> <ContractID>1000063</ContractID>
<ContractName>SomeContract3</ContractName> <ContractName>SomeContract63</ContractName>
</Contract> </Contract>
</Contracts> </Contracts>
</NewElement> </NewElement>
<NewElement> <NewElement>
<PersonID> <PersonID>
<ID>1</ID> <ID>7</ID>
</PersonID> </PersonID>
<Salutation>Salutation0</Salutation> <Salutation>Salutation7</Salutation>
<Name>Name0</Name> <Name>Name7</Name>
<GivenName>Martin</GivenName> <GivenName>Martin7</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth> <DateOfBirth>1970-01-07</DateOfBirth>
<HomeAddress> <HomeAddress>
<Street>Street 0</Street> <Street>Street 7</Street>
<ZIP>00000</ZIP> <ZIP>00007</ZIP>
<City>City0</City> <City>City7</City>
<Country>Country0</Country> <Country>Country7</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4900000007</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++491700000007</MobilePhoneNumber>
</HomeAddress> </HomeAddress>
<WorkAddress> <WorkAddress>
<Street>Somestreet 23</Street> <Street>Somestreet 7</Street>
<ZIP>12345</ZIP> <ZIP>777777</ZIP>
<City>SomeCity</City> <City>SomeCity7</City>
<Country>Germany</Country> <Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4970000007</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++4970000007</MobilePhoneNumber>
</WorkAddress> </WorkAddress>
<Contracts> <Contracts>
<Contract> <Contract>
<ContractID>100000</ContractID> <ContractID>100007</ContractID>
<ContractName>SomeContract0</ContractName> <ContractName>SomeContract7</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100001</ContractID> <ContractID>100071</ContractID>
<ContractName>SomeContract1</ContractName> <ContractName>SomeContract71</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100002</ContractID> <ContractID>100077</ContractID>
<ContractName>SomeContract2</ContractName> <ContractName>SomeContract77</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100003</ContractID> <ContractID>1000073</ContractID>
<ContractName>SomeContract3</ContractName> <ContractName>SomeContract73</ContractName>
</Contract> </Contract>
</Contracts> </Contracts>
</NewElement> </NewElement>
<NewElement> <NewElement>
<PersonID> <PersonID>
<ID>1</ID> <ID>8</ID>
</PersonID> </PersonID>
<Salutation>Salutation0</Salutation> <Salutation>Salutation8</Salutation>
<Name>Name0</Name> <Name>Name8</Name>
<GivenName>Martin</GivenName> <GivenName>Martin8</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth> <DateOfBirth>1970-01-08</DateOfBirth>
<HomeAddress> <HomeAddress>
<Street>Street 0</Street> <Street>Street 8</Street>
<ZIP>00000</ZIP> <ZIP>00008</ZIP>
<City>City0</City> <City>City8</City>
<Country>Country0</Country> <Country>Country8</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4900000008</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++491700000008</MobilePhoneNumber>
</HomeAddress> </HomeAddress>
<WorkAddress> <WorkAddress>
<Street>Somestreet 23</Street> <Street>Somestreet 8</Street>
<ZIP>12345</ZIP> <ZIP>888888</ZIP>
<City>SomeCity</City> <City>SomeCity8</City>
<Country>Germany</Country> <Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4980000008</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++4980000008</MobilePhoneNumber>
</WorkAddress> </WorkAddress>
<Contracts> <Contracts>
<Contract> <Contract>
<ContractID>100000</ContractID> <ContractID>100008</ContractID>
<ContractName>SomeContract0</ContractName> <ContractName>SomeContract8</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100001</ContractID> <ContractID>100081</ContractID>
<ContractName>SomeContract1</ContractName> <ContractName>SomeContract81</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100002</ContractID> <ContractID>100088</ContractID>
<ContractName>SomeContract2</ContractName> <ContractName>SomeContract88</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100003</ContractID> <ContractID>1000083</ContractID>
<ContractName>SomeContract3</ContractName> <ContractName>SomeContract83</ContractName>
</Contract> </Contract>
</Contracts> </Contracts>
</NewElement> </NewElement>
<NewElement> <NewElement>
<PersonID> <PersonID>
<ID>1</ID> <ID>9</ID>
</PersonID> </PersonID>
<Salutation>Salutation0</Salutation> <Salutation>Salutation9</Salutation>
<Name>Name0</Name> <Name>Name9</Name>
<GivenName>Martin</GivenName> <GivenName>Martin9</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth> <DateOfBirth>1970-01-09</DateOfBirth>
<HomeAddress> <HomeAddress>
<Street>Street 0</Street> <Street>Street 9</Street>
<ZIP>00000</ZIP> <ZIP>00009</ZIP>
<City>City0</City> <City>City9</City>
<Country>Country0</Country> <Country>Country9</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4900000009</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++491700000009</MobilePhoneNumber>
</HomeAddress> </HomeAddress>
<WorkAddress> <WorkAddress>
<Street>Somestreet 23</Street> <Street>Somestreet 9</Street>
<ZIP>12345</ZIP> <ZIP>999999</ZIP>
<City>SomeCity</City> <City>SomeCity9</City>
<Country>Germany</Country> <Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++4990000009</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++4990000009</MobilePhoneNumber>
</WorkAddress> </WorkAddress>
<Contracts> <Contracts>
<Contract> <Contract>
<ContractID>100000</ContractID> <ContractID>100009</ContractID>
<ContractName>SomeContract0</ContractName> <ContractName>SomeContract9</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100001</ContractID> <ContractID>100091</ContractID>
<ContractName>SomeContract1</ContractName> <ContractName>SomeContract91</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100002</ContractID> <ContractID>100099</ContractID>
<ContractName>SomeContract2</ContractName> <ContractName>SomeContract99</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100003</ContractID> <ContractID>1000093</ContractID>
<ContractName>SomeContract3</ContractName> <ContractName>SomeContract93</ContractName>
</Contract> </Contract>
</Contracts> </Contracts>
</NewElement> </NewElement>
<NewElement> <NewElement>
<PersonID> <PersonID>
<ID>1</ID> <ID>10</ID>
</PersonID> </PersonID>
<Salutation>Salutation0</Salutation> <Salutation>Salutation10</Salutation>
<Name>Name0</Name> <Name>Name10</Name>
<GivenName>Martin</GivenName> <GivenName>Martin10</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth> <DateOfBirth>1970-01-010</DateOfBirth>
<HomeAddress> <HomeAddress>
<Street>Street 0</Street> <Street>Street 10</Street>
<ZIP>00000</ZIP> <ZIP>000010</ZIP>
<City>City0</City> <City>City10</City>
<Country>Country0</Country> <Country>Country10</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++49000000010</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++4917000000010</MobilePhoneNumber>
</HomeAddress> </HomeAddress>
<WorkAddress> <WorkAddress>
<Street>Somestreet 23</Street> <Street>Somestreet 10</Street>
<ZIP>12345</ZIP> <ZIP>101010101010</ZIP>
<City>SomeCity</City> <City>SomeCity10</City>
<Country>Germany</Country> <Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber> <PhoneNumber>++491000000010</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber> <MobilePhoneNumber>++491000000010</MobilePhoneNumber>
</WorkAddress> </WorkAddress>
<Contracts> <Contracts>
<Contract> <Contract>
<ContractID>100000</ContractID> <ContractID>1000010</ContractID>
<ContractName>SomeContract0</ContractName> <ContractName>SomeContract10</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100001</ContractID> <ContractID>1000101</ContractID>
<ContractName>SomeContract1</ContractName> <ContractName>SomeContract101</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100002</ContractID> <ContractID>10001010</ContractID>
<ContractName>SomeContract2</ContractName> <ContractName>SomeContract1010</ContractName>
</Contract> </Contract>
<Contract> <Contract>
<ContractID>100003</ContractID> <ContractID>10000103</ContractID>
<ContractName>SomeContract3</ContractName> <ContractName>SomeContract103</ContractName>
</Contract> </Contract>
</Contracts> </Contracts>
</NewElement> </NewElement>
+11
View File
@@ -0,0 +1,11 @@
use lib '../lib';
use lib '../example/lib';
use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch';
use strict;
use MyInterfaces::TestService::TestPort;
my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too
for (1..100) { $soap->ListPerson({}) };
+5 -8
View File
@@ -69,8 +69,6 @@ my $url = $ARGV[0];
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help}); pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
pod2usage( -exit => 1 , verbose => 1 ) if not ($url); pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy}; local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy}; local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy};
@@ -81,12 +79,11 @@ my $lwp = LWP::UserAgent->new(
); );
$lwp->env_proxy(); # get proxy from environment. Works for both http & https. $lwp->env_proxy(); # get proxy from environment. Works for both http & https.
my $response = $lwp->get($url); my $parser = SOAP::WSDL::Expat::WSDLParser->new({
die $response->message(), "\n" if $response->code != 200; user_agent => $lwp,
});
my $xml = $response->content(); my $definitions = $parser->parse_uri( $url );
my $definitions = $parser->parse_string( $xml );
my %typemap = (); my %typemap = ();
@@ -112,7 +109,7 @@ $generator->set_element_prefix($opt{ element_prefix }) if $generator->can('set_e
$generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix'); $generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix');
$generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH'); $generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH');
$generator->set_definitions($definitions) if $generator->can('set_definitions'); $generator->set_definitions($definitions) if $generator->can('set_definitions');
$generator->set_wsdl($xml) if $generator->can('set_wsdl'); # $generator->set_wsdl($xml) if $generator->can('set_wsdl');
# start with typelib, as errors will most likely occur here... # start with typelib, as errors will most likely occur here...
$generator->generate(); $generator->generate();
+2 -1
View File
@@ -1,7 +1,8 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
package main;
use strict; use strict;
use warnings; use warnings;
use lib qw(../lib ../../lib); #use lib qw(../lib ../../lib);
use MyElements::ListPersonResponse; use MyElements::ListPersonResponse;
use MyServer::TestService::TestPort; use MyServer::TestService::TestPort;
my $server = MyServer::TestService::TestPort->new({ my $server = MyServer::TestService::TestPort->new({
+1
View File
@@ -21,3 +21,4 @@ die $result if not $result;
# I have to lookup the output parameter from the interface's POD - or try: # I have to lookup the output parameter from the interface's POD - or try:
# Will die on bad method names with a list of available methods # Will die on bad method names with a list of available methods
print $result->get_sayHelloResult(), "\n"; print $result->get_sayHelloResult(), "\n";
+3 -2
View File
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
use strict; #use strict;
use warnings; use warnings;
use SOAP::Lite; use SOAP::Lite +trace;
# I have to lookup the URL from the WSDL # I have to lookup the URL from the WSDL
my $soap = SOAP::Lite->new( my $soap = SOAP::Lite->new(
@@ -26,3 +26,4 @@ my $som = $soap->call(
die $som->fault->{ faultstring } if ($som->fault); die $som->fault->{ faultstring } if ($som->fault);
print $som->result, "\n"; print $som->result, "\n";
+14 -8
View File
@@ -14,7 +14,7 @@ use Class::Std::Fast;
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType; use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
use LWP::UserAgent; use LWP::UserAgent;
our $VERSION= '2.00_25'; our $VERSION= '2.00_32';
my %no_dispatch_of :ATTR(:name<no_dispatch>); my %no_dispatch_of :ATTR(:name<no_dispatch>);
my %wsdl_of :ATTR(:name<wsdl>); my %wsdl_of :ATTR(:name<wsdl>);
@@ -176,7 +176,7 @@ sub _wsdl_init_methods :PRIVATE {
my $ns = $wsdl->get_targetNamespace(); my $ns = $wsdl->get_targetNamespace();
# get bindings, portType, message, part(s) - use private methods for clear separation... # get bindings, portType, message, part(s) - use private methods for clear separation...
$self->_wsdl_get_service if not ($service_of{ $ident }); $self->_wsdl_get_service();
$self->_wsdl_get_portType(); $self->_wsdl_get_portType();
$method_info_of{ $ident } = {}; $method_info_of{ $ident } = {};
@@ -187,9 +187,10 @@ sub _wsdl_init_methods :PRIVATE {
# get SOAP Action # get SOAP Action
# SOAP-Action is a required HTTP Header, so we need to look it up... # SOAP-Action is a required HTTP Header, so we need to look it up...
# There must be a soapAction uri - or the WSDL is invalid (and
# it's not us to prove that...)
my $soap_binding_operation = $binding_operation->get_operation()->[0]; my $soap_binding_operation = $binding_operation->get_operation()->[0];
$method->{ soap_action } = $soap_binding_operation ? $method->{ soap_action } = $soap_binding_operation->get_soapAction();
$soap_binding_operation->get_soapAction() : $method;
# get parts # get parts
# 1. get operation from port # 1. get operation from port
@@ -204,7 +205,10 @@ sub _wsdl_init_methods :PRIVATE {
my $message = $wsdl->find_message( $ns, $localname ) my $message = $wsdl->find_message( $ns, $localname )
or croak "Message {$ns}$localname not found in WSDL definition"; or croak "Message {$ns}$localname not found in WSDL definition";
if (my $body=$binding_operation->first_input()->first_body()) { # Is body not required? So there must be one? Do we need the "if"?
# if (
my $body=$binding_operation->first_input()->first_body();
# {
if ($body->get_parts()) { if ($body->get_parts()) {
$method->{ parts } = []; # make sure it's empty $method->{ parts } = []; # make sure it's empty
my $message_part_ref = $message->get_part(); my $message_part_ref = $message->get_part();
@@ -216,7 +220,9 @@ sub _wsdl_init_methods :PRIVATE {
grep { $_->get_name() eq $name } @{ $message_part_ref }; grep { $_->get_name() eq $name } @{ $message_part_ref };
} }
} }
} # }
# A body does not need to specify the parts of a messages.
# Use all of the message's parts if it does not.
$method->{ parts } ||= $message->get_part(); $method->{ parts } ||= $message->get_part();
# rpc / encoded methods may have a namespace specified. # rpc / encoded methods may have a namespace specified.
@@ -730,9 +736,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 477 $ $Rev: 534 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: WSDL.pm 477 2007-12-24 10:23:52Z kutterma $ $Id: WSDL.pm 534 2008-02-14 17:07:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
=cut =cut
+18 -41
View File
@@ -8,22 +8,32 @@ our $VERSION = '2.00_25';
sub call { sub call {
my ($self, $method, $body, $header) = @_; my ($self, $method, $body, $header) = @_;
# Treat non-objects special
if (not blessed $body) { if (not blessed $body) {
# make sure there's something sensible in our body data
$body = {} if not defined $body; $body = {} if not defined $body;
$body = ref $body eq 'ARRAY' ? $body : [ $body ]; $body = ref $body eq 'ARRAY' ? $body : [ $body ];
my $index = 0;
my @part_from; my @body_from = @{ $body }; # make a copy
foreach my $part (@{ $body }) {
my $class = $method->{ body }->{ parts }->[$index]; # build list of parts as objects initialized with
# parameters given
my @part_from = ();
foreach my $class (@{ $method->{ body }->{ parts } }) {
eval "require $class" || die $@; eval "require $class" || die $@;
push @part_from, $class->new($part); push @part_from, $class->new(shift(@body_from) || {});
$index++;
} }
# it's either the first part or a list ref with all parts...
$body = $#part_from ? \@part_from : $part_from[0]; $body = $#part_from ? \@part_from : $part_from[0];
} }
# if we have a header # if we have a header
if (%{ $method->{ header } }) { if (%{ $method->{ header } }) {
# trat non object special - as above, but only for one
if (not blessed $header) { if (not blessed $header) {
my $class = $method->{ header }->{ parts }->[0]; my $class = $method->{ header }->{ parts }->[0];
eval "require $class" || die $@; eval "require $class" || die $@;
@@ -33,39 +43,6 @@ sub call {
return $self->SUPER::call($method, $body, $header); return $self->SUPER::call($method, $body, $header);
} }
#sub __create_methods {
# my ($package, %info_of) = @_;
#
# no strict qw(refs);
# no warnings qw(redefine);
# for my $method (keys %info_of){
# my ($soap_action, @parts);
#
# # up to 2.00_10 we had list refs...
# if (ref $info_of{ $method }eq 'HASH') {
# @parts = @{ $info_of{ $method }->{ parts } };
# $soap_action = $info_of{ $method }->{ soap_action };
# }
# else {
# die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
# }
#
# *{ "$package\::$method" } = sub {
# my $self = shift;
# my @param = map {
# my $data = shift || {};
# eval "require $_";
# $_->new( $data );
# } @parts;
#
# return $self->SUPER::call( {
# operation => $method,
# soap_action => $soap_action,
# }, @param );
# }
# }
#}
1; 1;
__END__ __END__
@@ -101,9 +78,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 440 $ $Rev: 501 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Base.pm 440 2007-12-04 22:24:33Z kutterma $ $Id: Base.pm 501 2008-01-26 20:23:32Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
=cut =cut
+4 -3
View File
@@ -23,7 +23,8 @@ sub BUILD {
sub deserialize { sub deserialize {
my ($self, $content) = @_; my ($self, $content) = @_;
$parser_of{ ${ $self } } ||= SOAP::WSDL::Expat::MessageParser->new(); $parser_of{ ${ $self } } = SOAP::WSDL::Expat::MessageParser->new()
if not $parser_of{ ${ $self } };
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } ); $parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
eval { $parser_of{ ${ $self } }->parse_string( $content ) }; eval { $parser_of{ ${ $self } }->parse_string( $content ) };
if ($@) { if ($@) {
@@ -98,9 +99,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 427 $ $Rev: 501 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $ $Id: XSD.pm 501 2008-01-26 20:23:32Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
=cut =cut
+56 -2
View File
@@ -1,17 +1,71 @@
package SOAP::WSDL::Expat::Base; package SOAP::WSDL::Expat::Base;
use strict; use strict;
use warnings; use warnings;
use URI;
use XML::Parser::Expat; use XML::Parser::Expat;
our $VERSION = '2.00_27'; # TODO: convert to Class::Std::Fast based class - hash based classes suck.
our $VERSION = '2.00_32';
sub new { sub new {
my ($class, $args) = @_; my ($class, $arg_ref) = @_;
my $self = {}; my $self = {};
bless $self, $class; bless $self, $class;
$self->set_user_agent($arg_ref->{ user_agent })
if $arg_ref->{ user_agent };
$self->{ parsed } = $arg_ref->{ parsed } if $arg_ref->{ parsed };
return $self; return $self;
} }
sub clone {
my $self = shift;
my $class = ref $self;
my $clone = $class->new($self);
return $clone;
}
sub set_uri { $_[0]->{ uri } = $_[1]; }
sub get_uri { return $_[0]->{ uri }; }
sub set_user_agent { $_[0]->{ user_agent } = $_[1]; }
sub get_user_agent { return $_[0]->{ user_agent }; }
sub set_parsed {
my ($self, $uri) = @_;
$self->{ parsed }->{ $uri } = 1;
return;
}
sub is_parsed {
my ($self, $uri) = @_;
return exists $self->{ parsed }->{ $uri };
}
sub parse_uri {
my $self = shift;
my $uri = shift;
if ($self->is_parsed($uri)){
warn "$uri already imported. Ignoring it\n";
return;
}
$self->set_parsed($uri);
$self->set_uri( $uri );
if (not $self->{ user_agent }) {
require LWP::UserAgent;
$self->{ user_agent } = LWP::UserAgent->new();
}
my $response = $self->{ user_agent }->get($uri);
die $response->message() if $response->code() ne '200';
return $self->parse( $response->content() );
}
sub parse { sub parse {
eval { eval {
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] ); $_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
+7 -4
View File
@@ -117,7 +117,7 @@ sub _initialize {
no strict qw(refs); no strict qw(refs);
$parser->setHandlers( $parser->setHandlers(
Start => sub { Start => sub {
# my ($parser, $element, %_attrs) = @_; # my ($parser, $element, %attrs) = @_;
$_leaf = 1; # believe we're a leaf node until we see an end $_leaf = 1; # believe we're a leaf node until we see an end
@@ -128,7 +128,7 @@ sub _initialize {
return &{$content_check{ $depth }} return &{$content_check{ $depth }}
if exists $content_check{ $depth }; if exists $content_check{ $depth };
push @{ $path }, $_[1]; # step down in path push @{ $path }, $_[1]; # step down in path
return if $skip; # skip inside __SKIP__ return if $skip; # skip inside __SKIP__
# resolve class of this element # resolve class of this element
@@ -171,6 +171,9 @@ sub _initialize {
$current = bless \$o, $_class; $current = bless \$o, $_class;
} }
# set attributes if there are any
$current->attr({ @_[2..$#_] }) if (@_ > 2);
$depth++; $depth++;
return; return;
}, },
@@ -292,8 +295,8 @@ the same terms as perl itself
$Id: $ $Id: $
$LastChangedDate: 2007-12-24 11:23:52 +0100 (Mo, 24 Dez 2007) $ $LastChangedDate: 2008-02-02 10:19:45 +0100 (Sa, 02 Feb 2008) $
$LastChangedRevision: 477 $ $LastChangedRevision: 516 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
+70 -4
View File
@@ -5,7 +5,59 @@ use Carp;
use SOAP::WSDL::TypeLookup; use SOAP::WSDL::TypeLookup;
use base qw(SOAP::WSDL::Expat::Base); use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = q{2.00_27}; our $VERSION = q{2.00_32};
sub _import_children {
my ($self, $name, $imported, $importer, $import_namespace) = @_;
return if not $imported;
my $targetNamespace = $importer->get_targetNamespace();
my $push_method = "push_$name";
my $get_method = "get_$name";
no strict qw(refs);
my $value_ref = $imported->$get_method();
if ($value_ref) {
$value_ref = [ $value_ref ] if (not ref $value_ref eq 'ARRAY');
# set xmlns - can be different from parent
for (@{ $value_ref }) {
# fixup targetNamespace, but don't override
$_->set_targetNamespace( $import_namespace )
if ( ($import_namespace ne $targetNamespace) && ! $_->get_targetNamespace);
# update parent...
$_->set_parent( $importer );
}
# push elements into importing WSDL
$importer->$push_method(@{ $value_ref });
}
}
sub xml_schema_import {
my $self = shift;
my $schema = shift;
my $parser = $self->clone();
my %attr_of = @_;
my $import_namespace = $attr_of{ namespace };
my $uri = URI->new_abs($attr_of{schemaLocation}, $self->get_uri() );
my $import = $parser->parse_uri($uri);
for my $name ( qw(type element group) ) {
$self->_import_children( $name, $import, $schema, $import_namespace);
}
}
sub wsdl_import {
my $self = shift;
my $definitions = shift;
my $parser = $self->clone();
my %attr_of = @_;
my $import_namespace = $attr_of{ namespace };
my $uri = URI->new_abs($attr_of{location}, $self->get_uri() );
my $import = $parser->parse_uri($uri);
for my $name ( qw(types message binding portType service) ) {
$self->_import_children( $name, $import, $definitions, $import_namespace);
}
}
sub _initialize { sub _initialize {
my ($self, $parser) = @_; my ($self, $parser) = @_;
@@ -65,7 +117,7 @@ sub _initialize {
$current->init( _fixup_attrs($parser, %attrs) ); $current->init( _fixup_attrs($parser, %attrs) );
} }
elsif ($action->{ type } eq 'METHOD') { elsif ($action->{ type } eq 'METHOD') {
my $method = $action->{ method } || $localname; my $method = $action->{ method };
no strict qw(refs); no strict qw(refs);
# call method with # call method with
@@ -81,6 +133,20 @@ sub _initialize {
: _fixup_attrs($parser, %attrs) : _fixup_attrs($parser, %attrs)
); );
} }
elsif ($action->{type} eq 'HANDLER') {
my $method = $self->can($action->{method});
$method->($self, $current, %attrs);
}
else {
# TODO replace by hash lookup of known namespaces.
my $namespace = $parser->namespace($localname) || q{};
my $part = $namespace eq 'http://schemas.xmlsoap.org/wsdl/'
? 'WSDL 1.1'
: 'XML Schema';
warn "$part element <$localname> is not implemented yet"
if ($localname !~m{ \A (:? annotation | documentation ) \z }xms );
}
return; return;
}, },
@@ -179,8 +245,8 @@ the same terms as perl itself
$Id: $ $Id: $
$LastChangedDate: 2007-12-24 11:23:52 +0100 (Mo, 24 Dez 2007) $ $LastChangedDate: 2008-02-14 18:07:18 +0100 (Do, 14 Feb 2008) $
$LastChangedRevision: 477 $ $LastChangedRevision: 534 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $
+1 -1
View File
@@ -16,7 +16,7 @@ sub register {
sub get_deserializer { sub get_deserializer {
my ($self, $args_of_ref) = @_; my ($self, $args_of_ref) = @_;
$args_of_ref->{ soap_version } ||= '1.1';
# sanity check # sanity check
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }" die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } }); if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
+3 -3
View File
@@ -16,7 +16,7 @@ sub register {
sub get_serializer { sub get_serializer {
my ($self, $args_of_ref) = @_; my ($self, $args_of_ref) = @_;
$args_of_ref->{ soap_version } ||= '1.1';
# sanity check # sanity check
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }" die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } }); if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 510 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Serializer.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: Serializer.pm 510 2008-01-29 08:03:46Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
=cut =cut
+4 -4
View File
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Transport;
use strict; use strict;
use warnings; use warnings;
our $VERSION='2.00_25'; our $VERSION='2.00_31';
# class data # class data
my %registered_transport_of = (); my %registered_transport_of = ();
@@ -34,7 +34,7 @@ sub register {
sub get_transport { sub get_transport {
my ($class, $scheme, %attrs) = @_; my ($class, $scheme, %attrs) = @_;
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx; $scheme =~s{ \A ([^\:]+) \: .+ }{$1}x;
if ($registered_transport_of{ $scheme }) { if ($registered_transport_of{ $scheme }) {
no strict qw(refs); no strict qw(refs);
@@ -240,9 +240,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 459 $ $Rev: 524 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Transport.pm 459 2007-12-16 16:00:14Z kutterma $ $Id: Transport.pm 524 2008-02-10 23:24:43Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
=cut =cut
+21 -5
View File
@@ -25,17 +25,33 @@ sub _process :PROTECTED {
my ($self, $template, $arg_ref, $output) = @_; my ($self, $template, $arg_ref, $output) = @_;
my $ident = ident $self; my $ident = ident $self;
$tt_of{$ident} = Template->new( # always create a new Template object to
# force re-loading of plugins.
my $tt = Template->new(
DEBUG => 1, DEBUG => 1,
EVAL_PERL => $EVAL_PERL_of{ $ident }, EVAL_PERL => $EVAL_PERL_of{ $ident },
RECURSION => $RECURSION_of{ $ident }, RECURSION => $RECURSION_of{ $ident },
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident }, INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident }, OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
) PLUGIN_BASE => 'SOAP::WSDL::Generator::Template::Plugin',
if (not $tt_of{ $ident }); );
$tt_of{ $ident }->process( $template, $tt->process( $template,
{ {
context => {
namespace_prefix_map => {
'http://www.w3.org/2001/XMLSchema' => 'SOAP::WSDL::XSD::Typelib::Builtin',
},
namespace_map => {
},
prefix => {
interface => $self->get_interface_prefix,
element => $self->get_element_prefix,
server => $self->get_server_prefix,
type => $self->get_type_prefix,
typemap => $self->get_typemap_prefix,
}
},
definitions => $self->get_definitions, definitions => $self->get_definitions,
interface_prefix => $self->get_interface_prefix, interface_prefix => $self->get_interface_prefix,
server_prefix => $self->get_server_prefix, server_prefix => $self->get_server_prefix,
@@ -47,7 +63,7 @@ sub _process :PROTECTED {
%{ $arg_ref } %{ $arg_ref }
}, },
$output) $output)
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt_of{ $ident }->error(); or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error();
} }
1; 1;
@@ -0,0 +1,61 @@
package SOAP::WSDL::Generator::Template::Plugin::XSD;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_map> :default<{}>);
my %namespace_map_of :ATTR(:name<namespace_map> :default<{}>);
my %prefix_of :ATTR(:name<prefix> :default<()>);
# create a singleton
sub load { # called as MyPlugin->load($context)
my ($class, $context, @arg_from) = @_;
my $stash = $context->stash();
my $self = bless \do { my $o = Class::Std::Fast::ID() }, $class;
use Data::Dumper;
# die Data::Dumper::Dumper $stash->{ context };
$self->set_namespace_map( $stash->{ context }->{ namespace_map });
$self->set_namespace_prefix_map( $stash->{ context }->{ namespace_prefix_map });
$self->set_prefix( $stash->{ context }->{ prefix });
return $self; # returns 'MyPlugin'
}
sub new {
return shift;
}
sub _get_prefix {
my ($self, $type, $namespace) = @_;
return $namespace_prefix_map_of{ $$self }->{ $namespace }
|| ( ($namespace_map_of{ $$self }->{ $namespace })
? join ('::', $prefix_of{ $$self }->{ $type }, $namespace_map_of{ $$self }->{ $namespace })
: $prefix_of{ $$self }->{ $type }
)
|| $prefix_of{ $$self }->{ $type };
}
sub get_element_prefix {
shift->_get_prefix( 'element', shift );
}
sub get_interface_prefix {
shift->_get_prefix( 'interface', shift );
}
sub get_server_prefix {
shift->_get_prefix( 'server', shift );
}
sub get_type_prefix {
# die "WIX";
shift->_get_prefix( 'type', shift );
}
sub get_typemap_prefix {
shift->_get_prefix( 'typemap', shift );
}
sub error {}
1;
@@ -1,3 +1,4 @@
[% USE XSD -%]
[% interface_name = interface_prefix _ '::' [% interface_name = interface_prefix _ '::'
_ service.get_name.replace('\.', '::') _ '::' _ service.get_name.replace('\.', '::') _ '::'
_ port.get_name.replace('^.+\.',''); _ port.get_name.replace('^.+\.','');
@@ -32,14 +33,19 @@ sub START {
[% IF NO_POD; STOP; END %] [% IF NO_POD; STOP; END %]
__END__ __END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=pod [% pod %]
=head1 NAME [% head1 %] NAME
[% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service [% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service
=head1 SYNOPSIS [% head1 %] SYNOPSIS
use [% interface_name %]; use [% interface_name %];
my $interface = [% interface_name %]->new(); my $interface = [% interface_name %]->new();
@@ -50,30 +56,30 @@ __END__
[% END %] [% END %]
=head1 DESCRIPTION [% head1 %] DESCRIPTION
SOAP Interface for the [% service.get_name %] web service SOAP Interface for the [% service.get_name %] web service
located at [% port.first_address.get_location %]. located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %] [% head1 %] SERVICE [% service.get_name %]
[% service.get_documentation %] [% service.get_documentation %]
=head2 Port [% port.get_name %] [% head2 %] Port [% port.get_name %]
[% port.get_documentation %] [% port.get_documentation %]
=head1 METHODS [% head1 %] METHODS
=head2 General methods [% head2 %] General methods
=head3 new [% head3 %] new
Constructor. Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>. All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods [% head2 %] SOAP Service methods
[% INCLUDE Interface/POD/method_info.tt %] [% INCLUDE Interface/POD/method_info.tt %]
@@ -82,8 +88,8 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
%][% INCLUDE Interface/POD/Operation.tt %] %][% INCLUDE Interface/POD/Operation.tt %]
[% END %] [% END %]
=head1 AUTHOR [% head1 %] AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %] Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
=pod =cut
@@ -1,4 +1,6 @@
=head3 [% operation.get_name %] [%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% head3 = BLOCK %]=head3[% END -%]
[% head3 %] [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) ); [% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name ); port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
+16 -11
View File
@@ -45,14 +45,19 @@ sub handle {
[% IF NO_POD; STOP; END %] [% IF NO_POD; STOP; END %]
__END__ __END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=pod [% pod %]
=head1 NAME [% head1 %] NAME
[% server_name %] - SOAP Server Class for the [% service.get_name %] Web Service [% server_name %] - SOAP Server Class for the [% service.get_name %] Web Service
=head1 SYNOPSIS [% head1 %] SYNOPSIS
use [% server_name %]; use [% server_name %];
my $server = [% server_name %]->new({ my $server = [% server_name %]->new({
@@ -62,31 +67,31 @@ __END__
$server->handle(); $server->handle();
=head1 DESCRIPTION [% head1 %] DESCRIPTION
SOAP Server handler for the [% service.get_name %] web service SOAP Server handler for the [% service.get_name %] web service
located at [% port.first_address.get_location %]. located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %] [% head1 %] SERVICE [% service.get_name %]
[% service.get_documentation %] [% service.get_documentation %]
=head2 Port [% port.get_name %] [% head2 %] Port [% port.get_name %]
[% port.get_documentation %] [% port.get_documentation %]
=head1 METHODS [% head1 %] METHODS
=head2 General methods [% head2 %] General methods
=head3 new [% head3 %] new
Constructor. Constructor.
The C<dispatch_to> argument is mandatory. It must be a class or object The C<dispatch_to> argument is mandatory. It must be a class or object
implementing the SOAP Service methods listed below. implementing the SOAP Service methods listed below.
=head2 SOAP Service methods [% head2 %] SOAP Service methods
[% INCLUDE Server/POD/method_info.tt %] [% INCLUDE Server/POD/method_info.tt %]
@@ -94,7 +99,7 @@ implementing the SOAP Service methods listed below.
%][% INCLUDE Server/POD/Operation.tt %] %][% INCLUDE Server/POD/Operation.tt %]
[% END %] [% END %]
=head1 AUTHOR [% head1 %] AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %] Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
@@ -1,4 +1,7 @@
=head3 [% operation.get_name %] [%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% head3 = BLOCK %]=head3[% END -%]
[% head3 %] [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) ); [% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name ); port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
@@ -18,13 +18,18 @@ sub get_typemap {
__END__ __END__
=pod __END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
=head1 NAME [% pod %]
[% head1 %] NAME
[% typemap_prefix %]::[% service.get_name.replace('\.','::').replace('-', '_') %]; - typemap for ::[% service.get_name %]; [% typemap_prefix %]::[% service.get_name.replace('\.','::').replace('-', '_') %]; - typemap for ::[% service.get_name %];
=head1 DESCRIPTION [% head1 %] DESCRIPTION
Typemap created by SOAP::WSDL for map-based SOAP message parsers. Typemap created by SOAP::WSDL for map-based SOAP message parsers.
@@ -1,3 +1,4 @@
[% USE XSD(context) -%]
package [% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %]; package [% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %];
use strict; use strict;
use warnings; use warnings;
@@ -6,20 +7,27 @@ use warnings;
# Don't include any perl source here - there may be sub-packages... # Don't include any perl source here - there may be sub-packages...
#-%] #-%]
[% INCLUDE complexType/attributeSet.tt %]
1; 1;
=pod [%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=head1 NAME [% pod %]
[% head1 %] NAME
[% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %] [% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %]
=head1 DESCRIPTION [% head1 %] DESCRIPTION
Perl data type class for the XML Schema defined complextype Perl data type class for the XML Schema defined complextype
[% complexType.get_name %] from the namespace [% complexType.get_targetNamespace %]. [% complexType.get_name %] from the namespace [% complexType.get_targetNamespace %].
=head2 PROPERTIES [% head2 %] PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods: methods:
@@ -28,15 +36,15 @@ methods:
[% element.get_name %] [% element.get_name %]
[% END %] [% END %]
=head1 METHODS [% head1 %] METHODS
=head2 new [% head2 %] new
Constructor. The following data structure may be passed to new(): Constructor. The following data structure may be passed to new():
[% indent = ' '; INCLUDE complexType/POD/structure.tt %] [% indent = ' '; INCLUDE complexType/POD/structure.tt %]
=head1 AUTHOR [% head1 %] AUTHOR
Generated by SOAP::WSDL Generated by SOAP::WSDL
@@ -1,5 +1,5 @@
[% indent %]{ [% indent %]{
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %] [%- IF complexType.get_name %] # [% XSD.get_type_prefix(complexType.get_targetNamespace) %]::[% complexType.get_name %][% END %]
[%- indent = indent _ ' '; [%- indent = indent _ ' ';
FOREACH element = complexType.get_element %] FOREACH element = complexType.get_element %]
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%] [% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
@@ -1,5 +1,5 @@
[% indent %]{ [% indent %]{
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %] [%- IF complexType.get_name %] # [% XSD.get_type_prefix(complexType.get_targetNamespace) %]::[% complexType.get_name %][% END %]
[%- indent = indent _ ' ' %] [%- indent = indent _ ' ' %]
[% indent %]# One of the following elements. [% indent %]# One of the following elements.
[% indent %]# No occurance checks yet, so be sure to pass just one... [% indent %]# No occurance checks yet, so be sure to pass just one...
@@ -1,7 +1,10 @@
[% IF (complexType.get_variety == 'restriction'); [% IF (complexType.get_variety == 'restriction');
INCLUDE complexType/POD/restriction.tt(complexType = complexType); INCLUDE complexType/POD/restriction.tt(complexType = complexType);
ELSIF (complexType.get_variety == 'sequence'); ELSIF (complexType.get_variety == 'extension');
THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet"; #THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet";
%]
# No documentation generated for complexContent / extension yet
[%
ELSE; ELSE;
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }"; THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
END; END;
@@ -1,5 +1,5 @@
[% indent %]{ [% indent %]{
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %] [%- IF complexType.get_name %] # [% XSD.get_type_prefix(complexType.get_targetNamespace) %]::[% complexType.get_name %][% END %]
[%- indent = indent _ ' '; [%- indent = indent _ ' ';
FOREACH element = complexType.get_element %] FOREACH element = complexType.get_element %]
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%] [% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
@@ -0,0 +1,12 @@
[% IF (complexType.get_variety == 'restriction');
INCLUDE complexType/POD/restriction.tt(complexType = complexType);
ELSIF (complexType.get_variety == '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 }";
END;
%]
@@ -7,7 +7,7 @@ ELSIF (complexType.get_variety == 'group');
ELSIF (complexType.get_variety == 'choice'); ELSIF (complexType.get_variety == 'choice');
INCLUDE complexType/POD/choice.tt(complexType = complexType); INCLUDE complexType/POD/choice.tt(complexType = complexType);
ELSIF (complexType.get_contentModel == 'simpleContent'); ELSIF (complexType.get_contentModel == 'simpleContent');
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet"; INCLUDE complexType/POD/simpleContent.tt(complexType = complexType);
ELSIF (complexType.get_contentModel == 'complexContent'); ELSIF (complexType.get_contentModel == 'complexContent');
INCLUDE complexType/POD/complexContent.tt(complexType = complexType); INCLUDE complexType/POD/complexContent.tt(complexType = complexType);
END %], END %],
@@ -24,13 +24,9 @@ __PACKAGE__->_factory(
{ {
[% FOREACH element = complexType.get_element; [% FOREACH element = complexType.get_element;
IF (type = element.get_type); IF (type = element.get_type);
element_type = complexType.expand( type ); element_type = complexType.expand( type ); -%]
IF (element_type.0 == 'http://www.w3.org/2001/XMLSchema'); -%] [% element.get_name %] => '[% XSD.get_type_prefix(element_type.0) %]::[% element_type.1 %]',
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% element_type.1 %]', [% ELSE;
[% ELSE -%]
[% element.get_name %] => '[% type_prefix %]::[% element_type.1 %]',
[% END;
ELSE;
IF (element.first_simpleType); IF (element.first_simpleType);
atomic_types.${ element.get_name } = element.first_simpleType; atomic_types.${ element.get_name } = element.first_simpleType;
ELSIF (element.first_complexType); ELSIF (element.first_complexType);
@@ -38,7 +34,7 @@ __PACKAGE__->_factory(
ELSE; ELSE;
THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type - don't know what to do with it"; THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type - don't know what to do with it";
END; %] END; %]
[% element.get_name %] => '[% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]', [% element.get_name %] => '[% XSD.get_type_prefix(complexType.get_targetNamespace) %]::[% complexType.get_name %]::_[% element.get_name %]',
[% END; [% END;
END -%] END -%]
} }
@@ -1,7 +1,7 @@
[% FOREACH type IN atomic_types; %] [% FOREACH type IN atomic_types; %]
package [% type_prefix %]::[% complexType.get_name %]::_[% type.key %]; package [% XSD.get_type_prefix(complexType.get_targetNamespace) %]::[% complexType.get_name %]::_[% type.key %];
use strict; use strict;
use warnings; use warnings;
{ {
@@ -0,0 +1,44 @@
[% IF (complexType.get_attribute.size) %]
package [% XSD.get_type_prefix(complexType.get_targetNamespace) %]::[% complexType.get_name.replace('\.','::').replace('-','_') %]::_ATTR;
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
{ # BLOCK to scope variables
[%
FOREACH element = complexType.get_attribute %]
my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>);
[%- END %]
__PACKAGE__->_factory(
[ qw([% FOREACH element = complexType.get_attribute %]
[% element.get_name -%]
[% END %]
) ],
{
[% FOREACH element = complexType.get_attribute -%]
[% element.get_name %] => \%[% element.get_name %]_of,
[% END -%]
},
{
[% FOREACH element = complexType.get_attribute;
IF (type = element.get_type);
element_type = complexType.expand( type );
-%]
[% element.get_name %] => '[% XSD.get_type_prefix(element_type.0) %]::[% element_type.1 %]',
[%
ELSE;
IF (element.first_simpleType);
THROW NOT_IMPLEMENTED , "Attributes with atomic simpleType definition are not implemented yet";
atomic_types.${ element.get_name } = element.first_simpleType;
ELSE;
THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type - don't know what to do with it";
END; %]
[% element.get_name %] => '[% XSD.get_type_prefix(complexType.get_targetNamespace) %]::[% complexType.get_name %]::_[% element.get_name %]',
[% END;
END -%]
}
);
} # end BLOCK
[% END %]
@@ -2,6 +2,8 @@
INCLUDE complexType/restriction.tt(complexType = complexType); INCLUDE complexType/restriction.tt(complexType = complexType);
ELSIF (complexType.get_variety == 'sequence'); ELSIF (complexType.get_variety == 'sequence');
INCLUDE complexType/extension.tt(complexType = complexType); INCLUDE complexType/extension.tt(complexType = complexType);
ELSIF (complexType.get_variety == 'all');
INCLUDE complexType/extension.tt(complexType = complexType);
ELSE; ELSE;
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }"; THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
END; END;
@@ -1,5 +1,5 @@
[% IF (complexType.get_contentModel == 'simpleContent'); [% IF (complexType.get_contentModel == 'simpleContent');
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet"; INCLUDE complexType/simpleContent.tt(complexType = complexType);
ELSIF (complexType.get_contentModel == 'complexContent'); ELSIF (complexType.get_contentModel == 'complexContent');
INCLUDE complexType/complexContent.tt(complexType = complexType); INCLUDE complexType/complexContent.tt(complexType = complexType);
ELSE; ELSE;
@@ -20,7 +20,7 @@ END;
complexType.set_element( element_list ); complexType.set_element( element_list );
-%] -%]
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]); use base qw([% XSD.get_type_prefix(base_name.0) %]::[% base_name.1.replace('\.', '::') %]);
[% [%
INCLUDE complexType/variety.tt(complexType = complexType); INCLUDE complexType/variety.tt(complexType = complexType);
@@ -1,7 +1,7 @@
[% IF (base=complexType.get_base); [% IF (base=complexType.get_base);
base_name=complexType.expand(base); base_name=complexType.expand(base);
-%] -%]
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]); use base qw([% XSD.get_type_prefix(base_name.0) %]::[% base_name.1.replace('\.', '::') %]);
[% [%
ELSE; ELSE;
THROW NOT_IMPLEMENTED, "restriction without base not supported"; THROW NOT_IMPLEMENTED, "restriction without base not supported";
@@ -0,0 +1,8 @@
[% IF (complexType.get_variety == 'restriction');
INCLUDE complexType/restriction.tt(complexType = complexType);
ELSIF (complexType.get_variety == 'extension');
THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType simpleContent extension not implemented yet";
ELSE;
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
END;
%]
@@ -9,7 +9,12 @@ ELSIF (complexType.get_variety == 'choice');
INCLUDE complexType/all.tt(complexType = complexType); INCLUDE complexType/all.tt(complexType = complexType);
ELSIF (complexType.get_variety); ELSIF (complexType.get_variety);
THROW NOT_IMPLEMENTED, "Unknown variety ${ complexType.get_variety } in ${ complexType.get_name } (${ element.get_name })"; THROW NOT_IMPLEMENTED, "Unknown variety ${ complexType.get_variety } in ${ complexType.get_name } (${ element.get_name })";
ELSE; ELSE %]
# There's no variety - might be empty complexType
END; # There's no variety - empty complexType
%] use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
__PACKAGE__->_factory();
[% END %]
+34 -13
View File
@@ -1,4 +1,5 @@
package [% element_prefix %]::[% element.get_name.replace('\.','::') %]; [% USE XSD(context) %]
package [% XSD.get_element_prefix(element.get_targetNamespace) %]::[% element.get_name.replace('\.','::') %];
use strict; use strict;
use warnings; use warnings;
@@ -17,53 +18,73 @@ use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
[% INCLUDE _type_class.tt( type = type, node = element ) %] [% INCLUDE _type_class.tt( type = type, node = element ) %]
); );
}
[%- ELSIF (ref = element.get_ref); -%] [%- ELSIF (ref = element.get_ref); -%]
# element ref="[% ref %]" # element ref="[% ref %]"
use base qw( use base qw(
[% element_prefix %]::[% ref.split(':').1 %] [% element_prefix %]::[% ref.split(':').1 %]
); );
}
[%- ELSIF (simpleType = element.first_simpleType) %] [%- ELSIF (simpleType = element.first_simpleType) %]
# atomic simpleType: <element><simpleType # atomic simpleType: <element><simpleType
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
); );
[% INCLUDE simpleType/contentModel.tt %] [% INCLUDE simpleType/contentModel.tt -%]
}
[% ELSIF (complexType = element.first_complexType) %] [% ELSIF (complexType = element.first_complexType) %]
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
[% INCLUDE complexType/contentModel.tt; [% INCLUDE complexType/contentModel.tt -%]
END %]
}
package [% XSD.get_element_prefix(element.get_targetNamespace) %]::[% element.get_name.replace('\.','::').replace('-','_') %]::_ATTR;
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
[% INCLUDE complexType/attributeSet.tt %]
[% ELSE %]
} # end of BLOCK } # end of BLOCK
[% END %]
1; 1;
# __END__ [%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=pod [% pod %]
=head1 NAME [% head1 %] NAME
[% element_prefix %]::[% element.get_name %] [% XSD.get_element_prefix(element.get_targetNamespace) %]::[% element.get_name %]
=head1 DESCRIPTION [% head1 %] DESCRIPTION
Perl data type class for the XML Schema defined element Perl data type class for the XML Schema defined element
[% element.get_name %] from the namespace [% element.get_targetNamespace %]. [% element.get_name %] from the namespace [% element.get_targetNamespace %].
=head1 METHODS [% head1 %] METHODS
=head2 new [% head2 %] new
my $element = [% element_prefix %]::[% element.get_name %]->new($data); my $element = [% XSD.get_element_prefix(element.get_targetNamespace) %]::[% element.get_name %]->new($data);
Constructor. The following data structure may be passed to new(): Constructor. The following data structure may be passed to new():
[% indent = ' '; INCLUDE element/POD/structure.tt; %] [% indent = ' '; INCLUDE element/POD/structure.tt; %]
=head1 AUTHOR [% head1 %] AUTHOR
Generated by SOAP::WSDL Generated by SOAP::WSDL
@@ -1,4 +1,5 @@
package [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %]; [% USE XSD(context) -%]
package [% XSD.get_type_prefix(simpleType.get_targetNamespace) %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %];
use strict; use strict;
use warnings; use warnings;
@@ -11,11 +12,18 @@ sub get_xmlns { '[% simpleType.get_targetNamespace %]'};
1; 1;
=pod __END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=head1 [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %] [% pod %]
=head1 DESCRIPTION [% head1 %] [% XSD.get_type_prefix(simpleType.get_targetNamespace) %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %]
[% head1 %] DESCRIPTION
Perl data type class for the XML Schema defined simpleType Perl data type class for the XML Schema defined simpleType
[% simpleType.get_name %] from the namespace [% simpleType.get_targetNamespace %]. [% simpleType.get_name %] from the namespace [% simpleType.get_targetNamespace %].
@@ -28,17 +36,17 @@ ELSE;
THROW NOT_IMPLEMENTED "simpleType union not implemented yet in $simpleType.get_name"; THROW NOT_IMPLEMENTED "simpleType union not implemented yet in $simpleType.get_name";
END %] END %]
=head1 METHODS [% head1 %] METHODS
=head2 new [% head2 %] new
Constructor. Constructor.
=head2 get_value / set_value [% head2 %] get_value / set_value
Getter and setter for the simpleType's value. Getter and setter for the simpleType's value.
=head1 OVERLOADING [% head1 %] OVERLOADING
Depending on the simple type's base type, the following operations are overloaded Depending on the simple type's base type, the following operations are overloaded
@@ -48,7 +56,7 @@ Depending on the simple type's base type, the following operations are overloade
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information. Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR [% head1 %] AUTHOR
Generated by SOAP::WSDL Generated by SOAP::WSDL
+1 -1
View File
@@ -245,7 +245,7 @@ sub visit_XSD_ComplexType {
if ( grep { $_ eq $content_model} qw(all sequence choice) ) if ( grep { $_ eq $content_model} qw(all sequence choice) )
{ {
# visit child elements # visit child elements
for (@{ $type->get_element() }) { for (@{ $type->get_element() || [] }) {
$_->_accept( $self ); $_->_accept( $self );
} }
return; return;
+14 -11
View File
@@ -34,11 +34,11 @@ considered as bugs.
=item * RULES NOT APPLICABLE =item * RULES NOT APPLICABLE
WS-I Basic Profile contains rules for web services as a whole. SOAP::WSDL only WS-I Basic Profile contains rules for web services as a whole. SOAP::WSDL only
plays the part of one layer in a Web Service CONSUMER, thus does not implement plays the part of one layer in a Web Service CONSUMER / RECEIVER, thus does
some parts the WS-I Basic Profile references. not implement some parts the WS-I Basic Profile references.
This section contains rules not applicable for SOAP::WSDL, because they refer This section contains rules not applicable for SOAP::WSDL, because they refer
parts to web service SOAP::WSDL does not implement. to parts SOAP::WSDL does not implement.
=back =back
@@ -427,9 +427,10 @@ TODO support rpc-literal bindings.
In a DESCRIPTION the value of the location attribute of a wsdl:import element In a DESCRIPTION the value of the location attribute of a wsdl:import element
SHOULD be treated as a hint. SHOULD be treated as a hint.
SOAP::WSDL's schema parser does not handle import elements yet. The wsdl:import element imports the referenced WSDL definition.
TODO implement support for wsdl:import in SOAP::WSDL::Expat::WSDLParser. This is rather hard-wired and does not allow to specify a wsdl:import without
a resolvable location.
=head2 R4002 =head2 R4002
@@ -448,9 +449,7 @@ TODO Test whether UTF-16 works.
The wsdl:documentation element MAY occur as a child of the wsdl:import The wsdl:documentation element MAY occur as a child of the wsdl:import
element in a DESCRIPTION. element in a DESCRIPTION.
SOAP::WSDL's schema parser does not handle import elements yet. Not tested yet.
TODO implement support for wsdl:import in SOAP::WSDL::Expat::WSDLParser.
=head2 R2024 =head2 R2024
@@ -681,7 +680,11 @@ is Schema valid.
A DESCRIPTION MUST only use the WSDL "import" statement to import another A DESCRIPTION MUST only use the WSDL "import" statement to import another
WSDL description. WSDL description.
SOAP::WSDL has no means of generating WSDL definitions SOAP::WSDL (partially) supports the wsdl:import statement. The wsdl:include
statement is not supported (yet).
It's the responsibility of the WSDL author to use only the wsdl:import
statement for importing WSDL descriptions.
=head2 R2002 =head2 R2002
@@ -1249,9 +1252,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 478 $ $Rev: 514 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: WS_I.pod 478 2007-12-27 14:15:01Z kutterma $ $Id: WS_I.pod 514 2008-01-31 19:57:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $
=cut =cut
+67 -11
View File
@@ -24,12 +24,12 @@ You can use SOAP::WSDL::XSD based classes just like any perl class - you may
instantiate it, inherit from it etc. instantiate it, inherit from it etc.
You should be aware, that SOAP::WSDL::XSD based classes are inside-out You should be aware, that SOAP::WSDL::XSD based classes are inside-out
classes using Class::Std, though - things you would expect from hash-based classes using Class::Std::Fast, though - things you would expect from
classes like using the blessed hash ref as data storage won't work. hash-based classes like using the blessed hash ref as data storage won't work.
Moreover, most all SOAP::WSDL::XSD::Typelib based classes override Moreover, most all SOAP::WSDL::XSD::Typelib based classes override
Class::Std's default constructor for speed - you should not expect BUILD or Class::Std::Fast's default constructor for speed - you should not expect
START methods to work, unless you call them yourself (or define a new BUILD or START methods to work, unless you call them yourself (or define a new
constructor). constructor).
All SOAP::WSDL::XSD based complexType classes allow a hash ref matching their All SOAP::WSDL::XSD based complexType classes allow a hash ref matching their
@@ -40,11 +40,15 @@ will work fine.
All SOAP::WSDL::XSD based simpleType (and builtin) classes accept a single All SOAP::WSDL::XSD based simpleType (and builtin) classes accept a single
hash ref with the only key "value" and the value to be set as value. hash ref with the only key "value" and the value to be set as value.
=head2 Conversions
=head3 Array dereference
All SOAP::WSDL::XSD based classes overload arrayification - that is being All SOAP::WSDL::XSD based classes overload arrayification - that is being
accessed as a list ref - with a method returning [ $self ]. accessed as a list ref - with a method returning [ $self ].
This means that you can safely use the results of get_ELEMENT calls on This means that you can safely use the results of get_ELEMENT calls on
cmplexTypes as list refs (you'll have to check for definedness, though - complexTypes as list refs (you'll have to check for definedness, though -
see L<SOAP::WSDL::XSD::Typelib::Builtin|SOAP::WSDL::XSD::Typelib::Builtin> see L<SOAP::WSDL::XSD::Typelib::Builtin|SOAP::WSDL::XSD::Typelib::Builtin>
for details. for details.
@@ -65,6 +69,32 @@ L<HTML::Template::Compiled|HTML::Template::Compiled>, where you could say
<%/LOOP> <%/LOOP>
<%IF%> <%IF%>
Note that this does not work in HTML::Template::Compiled yet - the code
generated for the template checks UNIVERSAL::isa instead of dereferencing.
There's a ticket open in HTC to solve the issue.
=head3 as_hash_ref
SOAP::WSDL::XSD::Typelib::ComplexType based objects have a method as_hash_ref,
which returns the object's content as a hash reference.
This can be convenient for cloning:
my $class = ref $old;
my $clone = $class->new( $old->as_hash_ref() );
To convert from one type to another, you
can just say
my $new = MyTypes::NewType->new( $old->as_hash_ref() );
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.
=head1 HOW IT WORKS =head1 HOW IT WORKS
=head2 Base classes =head2 Base classes
@@ -277,8 +307,34 @@ the correspondent classes.
=head1 ATTRIBUTES =head1 ATTRIBUTES
XML attributes are not implemented yet. If you have a good idea on how to XML attributes are not implemented yet. The documentation below sketches
implement them, feel free to email me a proposal. how XML attributes will be implemented in the future.
All XML attributes are derived from SOAP::WSDL::XSD::Typelib::Attribute.
The attribute set for a XML element (derived from anySimpleType or
complexType) is implemented as a sub-package of the element derived from
SOAP::WSDL::XSD::Typelib::AttributeSet.
The sub-package is named as the top package, suffixed with C<_ATTR>.
All XML attributes for a XML element are set- and retrievable via the method
C<attr>. The name is chosen to allow mimicing SOAP::Lite's behaviour, which
allows setting a SOAP::Data object's attributes via C<attr>.
my $attrSet = $obj->attr();
$obj->attr({
whitespace => 'preserve',
nillable => 1,
});
SOAP::WSDL::XSD::Typelib::AttributeSet is derived from
SOAP::WSDL::XSD::Typelib::ComplexType with content model C<all>. The
individual attributes can be set and retrieved via the respective set_FOO /
get_FOO methods.
The C<attr> method provides auto-vivification: An xml object's attribute set
is instantiated when accessed.
=head1 CAVEATS =head1 CAVEATS
@@ -286,7 +342,7 @@ implement them, feel free to email me a proposal.
=item * START and BUILD are not being called =item * START and BUILD are not being called
In contrast to "normal" Class::Std based objects, the classes of the In contrast to "normal" Class::Std::Fast based objects, the classes of the
SOAP::WSDL::XSD::Typelib:: hierarchy (and all type and element classes SOAP::WSDL::XSD::Typelib:: hierarchy (and all type and element classes
generated by SOAP::WSDL) override Class::Std's constructor for performance generated by SOAP::WSDL) override Class::Std's constructor for performance
reasons. reasons.
@@ -295,10 +351,10 @@ If you inherit from such a class and place a START or BUILD method in it,
it will not get called - at least not unless you place something like this it will not get called - at least not unless you place something like this
at the top of you code: at the top of you code:
use Class::Std::Storable; use Class::Std::Fast::Storable;
In this case, Class::Std::Storable will export a new() method into your class, In this case, Class::Std::Fast::Storable will export a new() method into your
which in turn calls START and BUILD. class, which in turn calls START and BUILD.
The constructors of all SOAP::WSDL::XSD::Typelib:: classes don't ! The constructors of all SOAP::WSDL::XSD::Typelib:: classes don't !
+3 -2
View File
@@ -5,6 +5,7 @@ use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed); use Scalar::Util qw(blessed);
our $VERSION=q{2.00_27}; our $VERSION=q{2.00_27};
use SOAP::WSDL::Factory::Serializer;
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/'; my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance'; my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
@@ -119,9 +120,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 477 $ $Rev: 510 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: XSD.pm 477 2007-12-24 10:23:52Z kutterma $ $Id: XSD.pm 510 2008-01-29 08:03:46Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
=cut =cut
+16 -5
View File
@@ -2,9 +2,15 @@ package SOAP::WSDL::TypeLookup;
use strict; use strict;
use warnings; use warnings;
our $VERSION=q{2.00_31};
my %TYPES = ( my %TYPES = (
# wsdl: # wsdl:
'http://schemas.xmlsoap.org/wsdl/' => { 'http://schemas.xmlsoap.org/wsdl/' => {
'import' => {
type => 'HANDLER',
method => 'wsdl_import',
},
binding => { binding => {
type => 'CLASS', type => 'CLASS',
class => 'SOAP::WSDL::Binding', class => 'SOAP::WSDL::Binding',
@@ -81,12 +87,17 @@ my %TYPES = (
} }
}, },
'http://www.w3.org/2001/XMLSchema' => { 'http://www.w3.org/2001/XMLSchema' => {
'import' => {
type => 'HANDLER',
method => 'xml_schema_import',
},
schema => { schema => {
type => 'CLASS', type => 'CLASS',
class => 'SOAP::WSDL::XSD::Schema', class => 'SOAP::WSDL::XSD::Schema',
}, },
attribute => { attribute => {
type => 'SKIP' # not implemented yet type => 'CLASS',
class => 'SOAP::WSDL::XSD::Attribute' # not implemented yet
}, },
attributeGroup => { attributeGroup => {
type => 'SKIP', # not implemented yet type => 'SKIP', # not implemented yet
@@ -156,22 +167,22 @@ my %TYPES = (
}, },
group => { group => {
type => 'METHOD', type => 'METHOD',
method => 'set_flavor', method => 'set_variety',
value => 'group', value => 'group',
}, },
all => { all => {
type => 'METHOD', type => 'METHOD',
method => 'set_flavor', method => 'set_variety',
value => 'all', value => 'all',
}, },
choice => { choice => {
type => 'METHOD', type => 'METHOD',
method => 'set_flavor', method => 'set_variety',
value => 'choice', value => 'choice',
}, },
sequence => { sequence => {
type => 'METHOD', type => 'METHOD',
method => 'set_flavor', method => 'set_variety',
value => 'sequence', value => 'sequence',
}, },
}, },
+34
View File
@@ -0,0 +1,34 @@
package SOAP::WSDL::XSD::Attribute;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::Base);
our $VERSION=q{2.00_29};
#<attribute
# default = string
# fixed = string
# form = (qualified | unqualified)
# id = ID
# name = NCName
# ref = QName
# type = QName
# use = (optional | prohibited | required) : optional
# {any attributes with non-schema namespace . . .}>
# Content: (annotation?, (simpleType?))
#</attribute>
my %default_of :ATTR(:name<default> :default<()>);
my %fixed_of :ATTR(:name<fixed> :default<()>);
my %form_of :ATTR(:name<form> :default<()>);
# id provided by Base
# name provided by Base
my %type_of :ATTR(:name<type> :default<()>);
my %use_of :ATTR(:name<use> :default<()>);
# may be defined as atomic simpleType
my %simpleType_of :ATTR(:name<simpleType> :default<()>);
1;
+1 -1
View File
@@ -18,7 +18,7 @@ sub serialize {
my $prefix = $prefix_of{ $ns } my $prefix = $prefix_of{ $ns }
|| die 'No prefix found for namespace '. $ns; || die 'No prefix found for namespace '. $ns;
$xml .= ' type="' . $prefix . ':' $xml .= ' type="' . $prefix . ':'
. $self->get_name() . '"' if ($self->get_name() ); . $self->get_name() . '"';
} }
if (defined $value) { if (defined $value) {
+19 -17
View File
@@ -6,11 +6,13 @@ use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed); use Scalar::Util qw(blessed);
use base qw/SOAP::WSDL::Base/; use base qw/SOAP::WSDL::Base/;
our $VERSION=q{2.00_25}; our $VERSION=q{2.00_29};
my %annotation_of :ATTR(:name<annotation> :default<()>); my %annotation_of :ATTR(:name<annotation> :default<()>);
my %attribute_of :ATTR(:name<attribute> :default<()>);
my %element_of :ATTR(:name<element> :default<()>); my %element_of :ATTR(:name<element> :default<()>);
my %flavor_of :ATTR(:name<flavor> :default<()>); #my %flavor_of :ATTR(:name<flavor> :default<()>);
my %variety_of :ATTR(:name<variety> :default<()>);
my %base_of :ATTR(:name<base> :default<()>); my %base_of :ATTR(:name<base> :default<()>);
my %itemType_of :ATTR(:name<itemType> :default<()>); my %itemType_of :ATTR(:name<itemType> :default<()>);
my %enumeration_of :ATTR(:name<enumeration> :default<()>); my %enumeration_of :ATTR(:name<enumeration> :default<()>);
@@ -20,17 +22,17 @@ my %mixed_of :ATTR(:name<mixed> :default<()>); # default is fal
# is set to simpleContent/complexContent # is set to simpleContent/complexContent
my %content_model_of :ATTR(:name<contentModel> :default<NONE>); my %content_model_of :ATTR(:name<contentModel> :default<NONE>);
sub get_variety; *get_variety = \&get_flavor; sub get_flavor; *get_flavor = \&get_variety;
sub push_element { sub push_element {
my $self = shift; my $self = shift;
my $element = shift; my $element = shift;
if ($flavor_of{ ident $self } eq 'all') if ($variety_of{ ident $self } eq 'all')
{ {
$element->set_minOccurs(0) if not defined ($element->get_minOccurs); $element->set_minOccurs(0) if not defined ($element->get_minOccurs);
$element->set_maxOccurs(1) if not defined ($element->get_maxOccurs); $element->set_maxOccurs(1) if not defined ($element->get_maxOccurs);
} }
elsif ($flavor_of{ ident $self } eq 'sequence') elsif ($variety_of{ ident $self } eq 'sequence')
{ {
$element->set_minOccurs(1) if not defined ($element->get_minOccurs); $element->set_minOccurs(1) if not defined ($element->get_minOccurs);
$element->set_maxOccurs(1) if not defined ($element->get_maxOccurs); $element->set_maxOccurs(1) if not defined ($element->get_maxOccurs);
@@ -41,14 +43,14 @@ sub push_element {
sub set_restriction { sub set_restriction {
my $self = shift; my $self = shift;
my $element = shift; my $element = shift;
$flavor_of{ ident $self } = 'restriction'; $variety_of{ ident $self } = 'restriction';
$base_of{ ident $self } = $element->{ Value }; $base_of{ ident $self } = $element->{ Value };
} }
sub set_extension { sub set_extension {
my $self = shift; my $self = shift;
my $element = shift; my $element = shift;
$flavor_of{ ident $self } = 'extension'; $variety_of{ ident $self } = 'extension';
$base_of{ ident $self } = $element->{ Value }; $base_of{ ident $self } = $element->{ Value };
} }
@@ -63,7 +65,7 @@ sub serialize {
$opt->{ indent } ||= q{}; $opt->{ indent } ||= q{};
$opt->{ attributes } ||= []; $opt->{ attributes } ||= [];
my $flavor = $self->get_flavor(); my $variety = $self->get_variety();
my $xml = ($opt->{ readable }) ? $opt->{ indent } : q{}; # add indentation my $xml = ($opt->{ readable }) ? $opt->{ indent } : q{}; # add indentation
@@ -77,17 +79,17 @@ sub serialize {
delete $opt->{ attributes }; # don't propagate... delete $opt->{ attributes }; # don't propagate...
if ( $opt->{ autotype }) { if ( $opt->{ autotype }) {
my $ns = $self->get_targetNamespace(); my $ns = $self->get_targetNamespace();
# reverse namespace by prefix hash # reverse namespace by prefix hash
my %prefix_of = reverse %{ $opt->{ namespace } }; my %prefix_of = reverse %{ $opt->{ namespace } };
my $prefix = $prefix_of{ $ns } my $prefix = $prefix_of{ $ns }
|| die 'No prefix found for namespace '. $ns; || die 'No prefix found for namespace '. $ns;
$xml .= join q{}, " type=\"$prefix:", $self->get_name(), '" ' $xml .= join q{}, " type=\"$prefix:", $self->get_name(), '" '
if ($self->get_name() ); if ($self->get_name() );
} }
$xml .= '>'; $xml .= '>';
$xml .= "\n" if ( $opt->{ readable } ); # add linebreak $xml .= "\n" if ( $opt->{ readable } ); # add linebreak
if ( ($flavor eq "sequence") or ($flavor eq "all") ) { if ( ($variety eq "sequence") or ($variety eq "all") ) {
$opt->{ indent } .= "\t"; $opt->{ indent } .= "\t";
for my $element (@{ $self->get_element() }) { for my $element (@{ $self->get_element() }) {
# might be list - listify # might be list - listify
@@ -113,7 +115,7 @@ sub serialize {
$opt->{ indent } =~s/\t$//; $opt->{ indent } =~s/\t$//;
} }
else { else {
die "sorry, we just handle all and sequence types yet..."; die "sorry, we just handle all and sequence types yet...";
} }
$xml .= $opt->{ indent } if ( $opt->{ readable } ); # add indentation $xml .= $opt->{ indent } if ( $opt->{ readable } ); # add indentation
$xml .= '</' . $name . '>'; $xml .= '</' . $name . '>';
+1 -1
View File
@@ -53,7 +53,7 @@ sub serialize {
# TODO: implement final and substitutionGroup - maybe never implement # TODO: implement final and substitutionGroup - maybe never implement
# substitutionGroup ? # substitutionGroup ?
$name ||= $self->get_name(); $name = $self->get_name() if not ($name);
if ( $opt->{ qualify } ) { if ( $opt->{ qualify } ) {
$opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ]; $opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ];
+19
View File
@@ -0,0 +1,19 @@
package SOAP::WSDL::XSD::Typelib::Attribute;
use strict;
use warnings;
use base qw(SOAP::WSDL::XSD::Typelib::Element);
our $VERSION=q{2.00_29};
sub start_tag {
# my ($self, $opt, $value) = @_;
return q{} if (@_ < 3);
return qq{ $_[1]->{ name }="}
}
sub end_tag {
return q{"};
}
1;
+16
View File
@@ -0,0 +1,16 @@
package SOAP::WSDL::XSD::Typelib::AttributeSet;
use strict;
use warnings;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
our $VERSION=q{2.00_29};
sub serialize {
# we work on @_ for performance.
$_[1] ||= {}; # $option_ref
return ${ $_[0]->_serialize({ attr => 1 }) };
}
1;
+10 -3
View File
@@ -3,14 +3,17 @@ use strict;
use warnings; use warnings;
use Class::Std::Fast::Storable constructor => 'none'; use Class::Std::Fast::Storable constructor => 'none';
our $VERSION = q{2.00_29};
sub get_xmlns { 'http://www.w3.org/2001/XMLSchema' }; sub get_xmlns { 'http://www.w3.org/2001/XMLSchema' };
# use $_[1] for performance # use $_[1] for performance
sub start_tag { sub start_tag {
return q{} if not $#_; # return if no second argument ($opt) return q{} if not $#_; # return if no second argument ($opt)
if ($_[1]->{ name }) { if ($_[1]->{ name }) {
return "<$_[1]->{name} />" if $_[1]->{ empty }; return qq{ $_[1]->{name}="} if $_[1]->{ attr };
return "<$_[1]->{name} >"; return "<$_[1]->{name}/>" if $_[1]->{ empty };
return "<$_[1]->{name}>";
} }
return q{}; return q{};
} }
@@ -18,10 +21,14 @@ sub start_tag {
# use $_[1] for performance # use $_[1] for performance
sub end_tag { sub end_tag {
return $_[1] && defined $_[1]->{ name } return $_[1] && defined $_[1]->{ name }
? "</$_[1]->{name} >" ? $_[1]->{ attr }
? q{"}
: "</$_[1]->{name}>"
: q{}; : q{};
}; };
sub serialize_attr {};
sub serialize { q{} }; sub serialize { q{} };
sub serialize_qualified :STRINGIFY { sub serialize_qualified :STRINGIFY {
+63 -27
View File
@@ -9,7 +9,7 @@ require Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType); use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
our $VERSION = '2.00_27'; our $VERSION = '2.00_31';
my %ELEMENTS_FROM; my %ELEMENTS_FROM;
my %ATTRIBUTES_OF; my %ATTRIBUTES_OF;
@@ -39,6 +39,30 @@ sub AUTOMETHOD {
. "\n" . "\n"
} }
# Attribute handling
my %xml_attr_of :ATTR();
sub attr {
my $self = shift;
my $class = ref $self;
# disable strictness - in perl 5.10 %{ "$foo\::_bar" } triggers a
# symbolic reference error with strictness enabled
no strict qw(refs);
die "$class has no attributes" if not defined %{ "$class\::_ATTR::"};
if (@_) {
# setter
return $xml_attr_of{ $$self } = "$class\::_ATTR"->new(@_);
}
return $xml_attr_of{ $$self } if exists $xml_attr_of{ $$self };
return $xml_attr_of{ $$self } = "$class\::_ATTR"->new();
}
sub serialize_attr {
return q{} if not $xml_attr_of{ ${ $_[0] } };
$_[0]->attr()->serialize();
}
sub as_hash_ref { sub as_hash_ref {
my $self = shift; my $self = shift;
my $attributes_ref = $ATTRIBUTES_OF{ ref $self }; my $attributes_ref = $ATTRIBUTES_OF{ ref $self };
@@ -128,6 +152,10 @@ sub _factory {
# lists but don't do yet - oh my ! # lists but don't do yet - oh my !
*{ "$class\::set_$name" } = sub { *{ "$class\::set_$name" } = sub {
if (not $#_) {
delete $attribute_ref->{ ${ $_[0] } };
return;
};
my $is_ref = ref $_[1]; my $is_ref = ref $_[1];
$attribute_ref->{ ${ $_[0] } } = ($is_ref) $attribute_ref->{ ${ $_[0] } } = ($is_ref)
? ($is_ref eq 'ARRAY') ? ($is_ref eq 'ARRAY')
@@ -152,7 +180,7 @@ sub _factory {
: die croak "cannot use $is_ref reference as value for $name - $type required" : die croak "cannot use $is_ref reference as value for $name - $type required"
# not $is_ref # not $is_ref
: $type->new({ value => $_[1] }); : defined $_[1] ? $type->new({ value => $_[1] }) : () ;
return; return;
}; };
@@ -177,10 +205,6 @@ sub _factory {
push @{ $attribute_ref->{ ${ $_[0]} } }, $_[1]; push @{ $attribute_ref->{ ${ $_[0]} } }, $_[1];
return; return;
}; };
# TODO: remove this alias - we don't use it, and it's pretty much
# misleading...
*{ "$class\::$name" } = *{ "$class\::add_$name" };
} }
# TODO Could be moved as normal method into base class, e.g. here. # TODO Could be moved as normal method into base class, e.g. here.
@@ -202,8 +226,8 @@ sub _factory {
} }
: $_ =~ m{ \A # beginning of string : $_ =~ m{ \A # beginning of string
xmlns # xmlns xmlns # xmlns
}xms }xms # get_elements is inlined for performance.
? do {} ? ()
: do { use Data::Dumper; : do { use Data::Dumper;
croak "unknown field $_ in $class. Valid fields are:\n" croak "unknown field $_ in $class. Valid fields are:\n"
. join(', ', @{ $ELEMENTS_FROM{ $class } }) . "\n" . join(', ', @{ $ELEMENTS_FROM{ $class } }) . "\n"
@@ -212,23 +236,25 @@ sub _factory {
return $self; return $self;
}; };
# this _serialize method works fine for <all> and <sequence>
# this serialize method works fine for <all> and <sequence>
# complextypes, as well as for <restriction><all> or # complextypes, as well as for <restriction><all> or
# <restriction><sequence>. # <restriction><sequence>, and attribute sets.
#
# But what about choice, extension ? # But what about choice, extension ?
#
# Triggers XML attribute serialization if the options hash ref contains
# a attr element with a true value.
*{ "$class\::_serialize" } = sub { *{ "$class\::_serialize" } = sub {
my $ident = ${ $_[0]}; my $ident = ${ $_[0]};
my $option_ref = $_[1];
# return concatenated return value of serialize call of all # return concatenated return value of serialize call of all
# elements retrieved from get_elements expanding list refs. # elements retrieved from get_elements expanding list refs.
# get_elements is inlined for performance. return \join q{} , map {
return join q{} , map {
my $element = $ATTRIBUTES_OF{ $class }->{ $_ }->{ $ident }; my $element = $ATTRIBUTES_OF{ $class }->{ $_ }->{ $ident };
# do we have some content # do we have some content
if (defined $element) { if (defined $element) {
$element = [ $element ] $element = [ $element ] if not ref $element eq 'ARRAY';
if not ref $element eq 'ARRAY';
my $name = $_; my $name = $_;
map { map {
@@ -240,9 +266,9 @@ sub _factory {
# serialize complextype elments (of other types) with their # serialize complextype elments (of other types) with their
# serializer, but add element tags around. # serializer, but add element tags around.
else { else {
join q{}, $_->start_tag({ name => $name }) join q{}, $_->start_tag({ name => $name , %{ $option_ref } })
, $_->serialize() , $_->serialize()
, $_->end_tag({ name => $name }); , $_->end_tag({ name => $name , %{ $option_ref } });
} }
} @{ $element } } @{ $element }
} }
@@ -251,17 +277,20 @@ sub _factory {
} }
} (@{ $ELEMENTS_FROM{ $class } }); } (@{ $ELEMENTS_FROM{ $class } });
}; };
}
*{ "$class\::serialize" } = sub { sub serialize {
$_[1] ||= {}; # maybe even replace by assigning a constant var # we work on @_ for performance.
$_[1] ||= {}; # $option_ref
# do we have a empty element ? # get content first (pass by reference to avoid copying)
return $_[0]->start_tag({ %{ $_[1] }, empty => 1 }) my $content_ref = $_[0]->_serialize($_[1]); # option_ref
if not defined $ELEMENTS_FROM{ $class } or not @{ $ELEMENTS_FROM{ $class } };
return join q{}, $_[0]->start_tag($_[1]),
$_[0]->_serialize(), $_[0]->end_tag();
}
# do we have a empty element ?
return $_[0]->start_tag({ %{ $_[1] }, empty => 1 })
if not length ${ $content_ref };
return join q{}, $_[0]->start_tag($_[1]), ${ $content_ref }, $_[0]->end_tag();
} }
1; 1;
@@ -380,6 +409,13 @@ This means you may set element properties by passing
Examples are similar to the examples provided for new() above. Examples are similar to the examples provided for new() above.
Note that you cannot delete a property by setting it to undef - this sets
the property to a empty property object (with vaue undef).
To delete a property, say
$obj->set_FOO();
=head2 as_hash_ref =head2 as_hash_ref
Returns a hash ref representation of the complexType object Returns a hash ref representation of the complexType object
@@ -423,9 +459,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 477 $ $Rev: 524 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: ComplexType.pm 477 2007-12-24 10:23:52Z kutterma $ $Id: ComplexType.pm 524 2008-02-10 23:24:43Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $
=cut =cut
+10 -7
View File
@@ -1,8 +1,9 @@
#!/usr/bin/perl #!/usr/bin/perl
package SOAP::WSDL::XSD::Typelib::Element; package SOAP::WSDL::XSD::Typelib::Element;
use Class::Std::Fast::Storable constructor => 'none';
use strict; use strict;
our $VERSION=q{2.00_27}; our $VERSION=q{2.00_29};
my %NAME; my %NAME;
my %NILLABLE; my %NILLABLE;
@@ -37,6 +38,7 @@ BLOCK: {
} }
}; };
# use $_[0] and $_[1] for speed. # use $_[0] and $_[1] for speed.
sub start_tag { sub start_tag {
@@ -46,17 +48,18 @@ sub start_tag {
if ($_[1]->{ nil }) { if ($_[1]->{ nil }) {
return q{} if not $NILLABLE{ ref $_[0] }; return q{} if not $NILLABLE{ ref $_[0] };
push @attr_from, 'xsi:nil="true"'; push @attr_from, q{ xsi:nil="true"};
$ending = '/>'; $ending = '/>';
} }
if ($_[1]->{qualified}) { if ($_[1]->{qualified}) {
push @attr_from, 'xmlns="' . $_[0]->get_xmlns . '"'; push @attr_from, q{ xmlns="} . $_[0]->get_xmlns() . q{"};
} }
push @attr_from, $_[0]->serialize_attr();
# do we need to check for name ? Element ref="" should have it's own # do we need to check for name ? Element ref="" should have it's own
# start_tag. If we don't need to check, we can speed things up # start_tag. If we don't need to check, we can speed things up
return join q{ }, "<$_[1]->{ name }" , @attr_from , $ending if $_[1]->{ name }; return join q{}, "<$_[1]->{ name }" , @attr_from , $ending if $_[1]->{ name };
return join q{ }, "<$NAME{ ref $_[0]}" , @attr_from , $ending; return join q{}, "<$NAME{ ref $_[0]}" , @attr_from , $ending;
} }
# use $_[0] and $_[1] for speed. # use $_[0] and $_[1] for speed.
@@ -172,9 +175,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 477 $ $Rev: 498 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Element.pm 477 2007-12-24 10:23:52Z kutterma $ $Id: Element.pm 498 2008-01-20 22:47:18Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/Element.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/Element.pm $
=cut =cut
+11 -8
View File
@@ -4,23 +4,26 @@ use warnings;
use diagnostics; use diagnostics;
use Test::More tests => 17; # qw/no_plan/; # TODO: change to tests => N; use Test::More tests => 17; # qw/no_plan/; # TODO: change to tests => N;
use lib '../lib'; use lib '../lib';
use File::Spec;
use File::Basename qw(dirname);
eval { eval {
require Test::XML; require Test::XML;
import Test::XML import Test::XML
}; };
use Cwd;
my $path = cwd; my $path = File::Spec->rel2abs( dirname __FILE__ );
$path =~s|\/t\/?$||; # allow running from t/ and above (Build test) my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
use_ok(qw/SOAP::WSDL/); use_ok(qw/SOAP::WSDL/);
my $soap = SOAP::WSDL->new( my $soap;
wsdl => 'file:///' . $path .'/t/acceptance/wsdl/006_sax_client.wsdl', $soap = SOAP::WSDL->new(
outputxml => 1, # required, if not set ::SOM serializer will be loaded on wsdl => 'file:///' . $url .'/acceptance/wsdl/006_sax_client.wsdl',
# call outputxml => 1, # required, if not set ::SOM serializer will be loaded
)->wsdlinit(); )->wsdlinit();
$soap->servicename('MessageGateway'); $soap->servicename('MessageGateway');
+7 -7
View File
@@ -12,7 +12,7 @@ use_ok qw( MyElement );
my $obj = MyElement->new({ value => 'test'}); my $obj = MyElement->new({ value => 'test'});
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType') ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType')
, 'inherited class'; , 'inherited class';
is $obj->serialize_qualified(), '<MyElementName xmlns="urn:Test" >test</MyElementName>', 'stringification'; is $obj->serialize_qualified(), '<MyElementName xmlns="urn:Test">test</MyElementName>', 'stringification';
$obj = MyAtomicComplexTypeElement->new({ test=> 'Test', test2 => 'Test2'}); $obj = MyAtomicComplexTypeElement->new({ test=> 'Test', test2 => 'Test2'});
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType') ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
@@ -21,8 +21,8 @@ ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
ok $obj->get_test->isa('SOAP::WSDL::XSD::Typelib::Builtin::string') ok $obj->get_test->isa('SOAP::WSDL::XSD::Typelib::Builtin::string')
, 'element isa'; , 'element isa';
is $obj->serialize_qualified, '<MyAtomicComplexTypeElement xmlns="urn:Test" ><test >Test</test>' is $obj->serialize_qualified, '<MyAtomicComplexTypeElement xmlns="urn:Test"><test>Test</test>'
. '<test2 >Test2</test2></MyAtomicComplexTypeElement>' . '<test2>Test2</test2></MyAtomicComplexTypeElement>'
, 'stringification'; , 'stringification';
$obj = MyElement->new({ value => undef}); $obj = MyElement->new({ value => undef});
@@ -34,14 +34,14 @@ ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType')
$obj = MyAtomicComplexTypeElement->new({ test=> 'Test', test2 => [ 'Test2', 'Test3' ]}); $obj = MyAtomicComplexTypeElement->new({ test=> 'Test', test2 => [ 'Test2', 'Test3' ]});
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType') ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
, 'inherited class'; , 'inherited class';
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test" ><test >Test</test>' is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test"><test>Test</test>'
. '<test2 >Test2</test2>' . '<test2>Test2</test2>'
. '<test2 >Test3</test2>' . '<test2>Test3</test2>'
. '</MyAtomicComplexTypeElement>' . '</MyAtomicComplexTypeElement>'
, 'multi value stringification'; , 'multi value stringification';
ok $obj = MyComplexTypeElement->new({ MyTestName => 'test' }); ok $obj = MyComplexTypeElement->new({ MyTestName => 'test' });
is $obj->serialize_qualified(), '<MyComplexTypeElement xmlns="urn:Test" ><MyTestName >test</MyTestName ></MyComplexTypeElement>'; is $obj->serialize_qualified(), '<MyComplexTypeElement xmlns="urn:Test"><MyTestName>test</MyTestName></MyComplexTypeElement>';
__END__ __END__
+3 -3
View File
@@ -12,12 +12,12 @@ use_ok qw( MyComplexType );
my $obj = MyComplexType->new({ MyTestName => 'test' }); my $obj = MyComplexType->new({ MyTestName => 'test' });
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType') ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
, 'inherited class'; , 'inherited class';
is $obj, '<MyTestName >test</MyTestName >', 'stringification'; is $obj, '<MyTestName>test</MyTestName>', 'stringification';
$obj = MyComplexType->new({ MyTestName => [ 'test', 'test2' ] }); $obj = MyComplexType->new({ MyTestName => [ 'test', 'test2' ] });
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType') ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
, 'inherited class'; , 'inherited class';
is $obj, '<MyTestName >test</MyTestName ><MyTestName >test2</MyTestName >', is $obj, '<MyTestName>test</MyTestName><MyTestName>test2</MyTestName>',
'stringification'; 'stringification';
# try on the fly factory # try on the fly factory
@@ -36,7 +36,7 @@ is $obj, '<MyTestName >test</MyTestName ><MyTestName >test2</MyTestName >',
$obj = MyComplexType2->new({ MyTestName => [ 'test', 'test2' ] }); $obj = MyComplexType2->new({ MyTestName => [ 'test', 'test2' ] });
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType') ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
, 'inherited class (on the fly-factory object)'; , 'inherited class (on the fly-factory object)';
is $obj, '<MyTestName >test</MyTestName><MyTestName >test2</MyTestName>', is $obj, '<MyTestName>test</MyTestName><MyTestName>test2</MyTestName>',
'stringification (on the fly-factory object)'; 'stringification (on the fly-factory object)';
# TODO factor out into complexType test # TODO factor out into complexType test
+13 -6
View File
@@ -1,5 +1,5 @@
#!/usr/bin/perl #!/usr/bin/perl
use Test::More tests => 9; use Test::More tests => 10;
use strict; use strict;
use lib 'lib/'; use lib 'lib/';
use lib '../lib/'; use lib '../lib/';
@@ -20,8 +20,8 @@ ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
ok $obj->get_test->isa('SOAP::WSDL::XSD::Typelib::Builtin::string') ok $obj->get_test->isa('SOAP::WSDL::XSD::Typelib::Builtin::string')
, 'element isa'; , 'element isa';
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test" ><test >Test</test>' is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test"><test>Test</test>'
. '<test2 >Test2</test2></MyAtomicComplexTypeElement>' . '<test2>Test2</test2></MyAtomicComplexTypeElement>'
, 'stringification'; , 'stringification';
my $soap = SOAP::WSDL::Client->new( { my $soap = SOAP::WSDL::Client->new( {
@@ -48,16 +48,23 @@ ok $result->isa('SOAP::WSDL::SOAP::Typelib::Fault11'),
'return fault on impossible call'; 'return fault on impossible call';
ok ! $result, 'fault is false in boolean context'; ok ! $result, 'fault is false in boolean context';
package FakeResolver;
sub get_class { # $soap->no_dispatch(1);
my %class_list = ( ok ! $soap->call('Test'), 'second call';
package FakeResolver;
my %class_list = (
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11', 'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI', 'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType', 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType',
); );
sub get_class {
return $class_list{ $_[1] }; return $class_list{ $_[1] };
} }
sub get_typemap {
return \%class_list;
}
+62
View File
@@ -0,0 +1,62 @@
use strict;
use warnings;
use Test::More;
use File::Find;
if ( not $ENV{TEST_AUTHOR} ) {
my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
plan( skip_all => $msg );
}
require Test::Pod::Content;
import Test::Pod::Content;
my $dir = 'blib/lib';
if (-d '../t') {
$dir = '../lib';
}
my @filelist = ();
find( \&filelist, $dir);
sub filelist {
my $name = $_;
return if (-d $name);
return if $File::Find::name =~m{\.svn}x;
return if $File::Find::name !~m{\.pm$}x;
# skip builtin XSD types - they contain no pod
return if $File::Find::name =~m{SOAP/WSDL/XSD/Typelib/Builtin/.+}xms;
# skip data classes - they contain no pod
return if $File::Find::name =~m{SOAP/WSDL/Base\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Binding\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Message\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Operation\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/OpMessage\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Part\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Port\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/PortType\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Address\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Body\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Header\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/HeaderFault\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Operation\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Service\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/TypeLookup\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Types\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/Builtin\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/ComplexType\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/SimpleType\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/Element\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/Schema\.pm$}xms;
push @filelist, $File::Find::name;
}
plan tests => scalar @filelist;
for my $file (sort @filelist) {
pod_section_like( $file, 'LICENSE AND COPYRIGHT', qr{ This \s file \s is \s part \s of
\s SOAP-WSDL\. \s You \s may \s distribute/modify \s it \s under \s
the \s same \s terms \s as \s perl \s itself
}xms, "$file License notice");
}
+2 -2
View File
@@ -2,11 +2,11 @@ use strict;
use warnings; use warnings;
use Test::More tests => 12; use Test::More tests => 12;
use File::Spec; use File::Spec;
use File::Basename; use File::Basename qw(dirname);
use_ok qw(SOAP::WSDL); use_ok qw(SOAP::WSDL);
my $path = File::Spec->rel2abs(dirname( __FILE__ ) ); my $path = File::Spec->rel2abs(dirname( __FILE__ ) );
$path =~s{\\}{/}xmsg; # fix for windows
my $soap = SOAP::WSDL->new(); my $soap = SOAP::WSDL->new();
$soap->wsdl("file://$path/WSDL_NOT_FOUND.wsdl"); $soap->wsdl("file://$path/WSDL_NOT_FOUND.wsdl");
+10 -1
View File
@@ -1,4 +1,4 @@
use Test::More tests => 7; use Test::More tests => 10;
use strict; use strict;
use warnings; use warnings;
use diagnostics; use diagnostics;
@@ -29,3 +29,12 @@ ok( $soap->wsdlinit(), 'parsed WSDL' );
ok( $soap->wsdlinit( servicename => 'testService', portname => 'testPort'), 'parsed WSDL' ); ok( $soap->wsdlinit( servicename => 'testService', portname => 'testPort'), 'parsed WSDL' );
ok( ($soap->portname() eq 'testPort' ), 'found port passed to wsdlinit'); ok( ($soap->portname() eq 'testPort' ), 'found port passed to wsdlinit');
ok( $soap = SOAP::WSDL->new(
wsdl => 'file://' . $url . '/../../acceptance/wsdl/02_port.wsdl'
), 'Instantiated object' );
ok( $soap->wsdlinit() );
$soap->outputxml(1);
eval { $soap->call('test') };
like $@, qr{type \s tns:testSimpleType1 \s , \s urn:simpleType \s not \s found}xms;
+6 -2
View File
@@ -1,4 +1,4 @@
use Test::More tests => 8; use Test::More tests => 9;
use strict; use strict;
use warnings; use warnings;
use lib '../lib'; use lib '../lib';
@@ -28,7 +28,11 @@ ok( $soap = SOAP::WSDL->new(
), 'Instantiated object' ); ), 'Instantiated object' );
#3 #3
$soap->readable(1); SKIP: {
skip 'Cannot test warning without Test::Warn', 1 if not (eval "require Test::Warn");
Test::Warn::warning_like( sub { $soap->readable(1) },
qr{\A 'readable' \s has \s no \s effect \s any \s more}xms);
}
$soap->outputxml(1); $soap->outputxml(1);
ok( $soap->wsdlinit( ok( $soap->wsdlinit(
+37
View File
@@ -0,0 +1,37 @@
use strict;
use warnings;
use Test::More tests => 8; #qw(no_plan);
use_ok qw(SOAP::WSDL::Client);
ok my $client = SOAP::WSDL::Client->new();
ok $client = SOAP::WSDL::Client->new({
proxy => 'http://localhost',
});
is $client->get_endpoint(), 'http://localhost';
$client->no_dispatch(1);
$client->set_serializer('main');
my $serialize = $client->call({
operation => 'testMethod'
}, { foo => 'bar'}, { bar => 'baz'});
is $serialize->{ body }->{ foo }, 'bar';
is $serialize->{ header }->{ bar }, 'baz';
# Old calling style compatibility test - foo => bar is body...
$serialize = $client->call({
operation => 'testMethod'
}, foo => 'bar');
is $serialize->{ body }->{ foo }, 'bar';
# Old calling style compatibility test - foo => bar is body...
$serialize = $client->call('testMethod', foo => 'bar');
is $serialize->{ body }->{ foo }, 'bar';
sub serialize {
my $self = shift;
return shift;
}
+106 -7
View File
@@ -4,11 +4,9 @@ use Class::Std::Fast;
package main; package main;
use strict; use strict;
use warnings; use warnings;
use Test::More qw(no_plan); use Test::More tests => 21;
use_ok qw(SOAP::WSDL::Client::Base); use_ok qw(SOAP::WSDL::Client::Base);
my $client = SOAP::WSDL::Client::Base->new();
{ {
no warnings qw(redefine once); no warnings qw(redefine once);
*SOAP::WSDL::Client::call = sub { is $_[1]->{ operation }, 'sayHello', 'Called method'; *SOAP::WSDL::Client::call = sub { is $_[1]->{ operation }, 'sayHello', 'Called method';
@@ -16,6 +14,8 @@ my $client = SOAP::WSDL::Client::Base->new();
}; };
} }
my $client = SOAP::WSDL::Client::Base->new();
my @result = $client->call({ my @result = $client->call({
operation => 'sayHello', operation => 'sayHello',
soap_action => 'urn:HelloWorld#sayHello', soap_action => 'urn:HelloWorld#sayHello',
@@ -25,19 +25,23 @@ my @result = $client->call({
'use' => 'literal', 'use' => 'literal',
namespace => '', namespace => '',
encodingStyle => '', encodingStyle => '',
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )], parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string
SOAP::WSDL::XSD::Typelib::Builtin::string
)],
}, },
header => { header => {
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )], parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string
)],
}, },
headerfault => { headerfault => {
} }
}, { value => 'Body' }, { value => 'Header' }); }, { value => 'Body' }, { value => 'Header' });
is $result[0], 'Body'; is $result[0]->[0], 'Body';
is $result[1], 'Header'; is $result[1], 'Header';
isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string'; isa_ok $result[0]->[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
@result = $client->call({ @result = $client->call({
operation => 'sayHello', operation => 'sayHello',
@@ -63,3 +67,98 @@ isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
is $result[0], 'Body2'; is $result[0], 'Body2';
is $result[1], 'Header2'; is $result[1], 'Header2';
isa_ok $result[1], 'SOAP::WSDL::XSD::Typelib::Builtin::string'; isa_ok $result[1], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
# Call with more body parts than parameters. Body parts are empty
@result = $client->call({
operation => 'sayHello',
soap_action => 'urn:HelloWorld#sayHello',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
},
header => {
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
},
headerfault => {
}
}, [],
SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'Header2' })
);
isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
is $result[0], undef;
is $result[1], 'Header2';
isa_ok $result[1], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
# Call with more body parts than parameters. Body parts are empty
# No header
@result = $client->call({
operation => 'sayHello',
soap_action => 'urn:HelloWorld#sayHello',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
},
header => {
},
headerfault => {
}
});
isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
is $result[0], undef;
eval { $client->call({
operation => 'sayHello',
soap_action => 'urn:HelloWorld#sayHello',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( SomeStupidClassYouProbablyDontHaveOnYourSystem )],
},
header => {
},
headerfault => {
}
})
};
like $@, qr{ Can't \s locate }xms;
isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
is $result[0], undef;
eval { $client->call({
operation => 'sayHello',
soap_action => 'urn:HelloWorld#sayHello',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
},
header => {
parts => [qw( SomeOtherStupidClassYouProbablyDontHaveOnYourSystem )],
},
headerfault => {
}
})
};
# die $@;
like $@, qr{ Can't \s locate }xms;
+32
View File
@@ -0,0 +1,32 @@
use strict;
use warnings;
use Test::More tests => 4;
use SOAP::WSDL::PortType;
use_ok qw(SOAP::WSDL::Definitions);
my $obj = SOAP::WSDL::Definitions->new({
portType => [
SOAP::WSDL::PortType->new({
name => 'foo',
targetNamespace => 'bar',
}),
SOAP::WSDL::PortType->new({
name => 'foo',
targetNamespace => 'baz',
}),
SOAP::WSDL::PortType->new({
name => 'foobar',
targetNamespace => 'bar',
}),
]
});
my $found= $obj->find_portType('bar', 'foobar');
is $found->get_name(), 'foobar', 'found PortType';
$found = $obj->find_portType('baz', 'foo');
is $found->get_name(), 'foo', 'found PortType';
$found = $obj->find_portType('baz', 'foobar');
is $found, undef, 'find_PortType returns undef on unknown PortType';
+4 -1
View File
@@ -4,7 +4,7 @@ package TestResolver;
sub get_typemap { {} }; sub get_typemap { {} };
package main; package main;
use Test::More tests => 8; use Test::More tests => 9;
use SOAP::WSDL::Deserializer::XSD; use SOAP::WSDL::Deserializer::XSD;
@@ -25,3 +25,6 @@ is $fault->get_faultcode(), 'soap:Client';
isa_ok $obj->deserialize('rubbeldiekatz'), 'SOAP::WSDL::SOAP::Typelib::Fault11'; isa_ok $obj->deserialize('rubbeldiekatz'), 'SOAP::WSDL::SOAP::Typelib::Fault11';
isa_ok $obj->deserialize('<zumsel></zumsel>'), 'SOAP::WSDL::SOAP::Typelib::Fault11'; isa_ok $obj->deserialize('<zumsel></zumsel>'), 'SOAP::WSDL::SOAP::Typelib::Fault11';
isa_ok $obj->deserialize('<Envelope xmlns="huchmampf"></Envelope>'), 'SOAP::WSDL::SOAP::Typelib::Fault11'; isa_ok $obj->deserialize('<Envelope xmlns="huchmampf"></Envelope>'), 'SOAP::WSDL::SOAP::Typelib::Fault11';
is $obj->deserialize('<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body ></SOAP-ENV:Body></SOAP-ENV:Envelope>'), undef, 'Deserialize empty envelope';
+10 -1
View File
@@ -1,6 +1,6 @@
use strict; use strict;
use warnings; use warnings;
use Test::More tests => 3; use Test::More tests => 5;
use_ok qw(SOAP::WSDL::Expat::Base); use_ok qw(SOAP::WSDL::Expat::Base);
my $parser = SOAP::WSDL::Expat::Base->new(); my $parser = SOAP::WSDL::Expat::Base->new();
@@ -10,3 +10,12 @@ ok $@;
eval { $parser->parsefile('Foobar')}; eval { $parser->parsefile('Foobar')};
ok $@; ok $@;
$parser = SOAP::WSDL::Expat::Base->new({
user_agent => 'foo',
});
is $parser->get_user_agent(), 'foo';
$parser->set_user_agent('bar');
is $parser->get_user_agent(), 'bar';
@@ -1,10 +1,12 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
use strict; use strict;
use warnings; use warnings;
use Test::More tests => 2; use Test::More tests => 4;
use lib '../../../../lib';
use lib '../../../../t/lib';
use lib 't/lib';
use lib '../lib'; use lib '../lib';
use lib 'lib'; use lib 'lib';
use lib 't/lib';
use_ok(qw/SOAP::WSDL::Expat::MessageParser/); use_ok(qw/SOAP::WSDL::Expat::MessageParser/);
@@ -26,10 +28,34 @@ my $parser = SOAP::WSDL::Expat::MessageParser->new({
$parser->parse( $xml ); $parser->parse( $xml );
is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test" >} is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test">}
. q{<test >Test</test><test2 >Test2</test2></MyAtomicComplexTypeElement>} . q{<test>Test</test><test2>Test2</test2></MyAtomicComplexTypeElement>}
, 'Content comparison'; , 'Content comparison';
my $xml_attr = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body><MyElementAttrs xmlns="urn:Test" test="Test" test2="Test2">
<test>Test</test>
<test2 > </test2>
</MyElementAttrs></SOAP-ENV:Body></SOAP-ENV:Envelope>};
$parser->parse($xml_attr);
is $parser->get_data(),
q{<MyElementAttrs xmlns="urn:Test" test="Test" test2="Test2"><test>Test</test></MyElementAttrs>},
'Content with attributes';
my $xml_error = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body><MyElementAttrs xmlns="urn:Test" test="Test" test2="Test2">
<test>Test</test>
<test2 ></test2>
<foo>Bar</foo>
</MyElementAttrs></SOAP-ENV:Body></SOAP-ENV:Envelope>};
eval { $parser->parse($xml_error) };
like $@, qr{\A Cannot \s resolve \s class \s for \s MyElementAttrs/foo }x, 'XML error';
# data classes reside in t/lib/Typelib/ # data classes reside in t/lib/Typelib/
BEGIN { BEGIN {
package FakeResolver; package FakeResolver;
@@ -41,6 +67,9 @@ BEGIN {
'MyAtomicComplexTypeElement/foo' => '__SKIP__', 'MyAtomicComplexTypeElement/foo' => '__SKIP__',
# 'MyAtomicComplexTypeElement/foo/bar' => 'MyFooElement', # 'MyAtomicComplexTypeElement/foo/bar' => 'MyFooElement',
# 'MyAtomicComplexTypeElement/foo/baz' => 'MyFooElement', # 'MyAtomicComplexTypeElement/foo/baz' => 'MyFooElement',
'MyElementAttrs' => 'MyElementAttrs',
'MyElementAttrs/test' => 'MyTestElement',
'MyElementAttrs/test2' => 'MyTestElement2',
); );
sub new { return bless {}, 'FakeResolver' }; sub new { return bless {}, 'FakeResolver' };
@@ -50,9 +79,7 @@ BEGIN {
sub get_class { sub get_class {
my $name = join('/', @{ $_[1] }); my $name = join('/', @{ $_[1] });
return ($class_list{ $name }) ? $class_list{ $name } return ($class_list{ $name }) ? $class_list{ $name }
: warn "no class found for $name"; : undef;
}; };
}; };
}; };
+74
View File
@@ -0,0 +1,74 @@
use strict;
use warnings;
use Test::More tests => 11; #qw(no_plan);
use File::Spec;
use File::Basename;
my $path = File::Spec->rel2abs( dirname __FILE__ );
use_ok qw( SOAP::WSDL::Expat::WSDLParser);
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
my $definitions = $parser->parse_file(
"$path/../../../acceptance/wsdl/WSDLParser.wsdl"
);
use Data::Dumper;
my $schema = $definitions->first_types()->get_schema()->[1];
my $attr = $schema->get_element()->[0]->first_complexType->first_attribute();
ok $attr->get_name('testAttribute');
ok $attr->get_type('xs:string');
use SOAP::WSDL::Generator::Template::XSD;
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
definitions => $definitions,
type_prefix => 'Foo',
element_prefix => 'Foo',
typemap_prefix => 'Foo',
OUTPUT_PATH => "$path/testlib",
});
#my $code = "";
#$generator->set_output(\$code);
#$generator->generate_typelib();
#{
# eval $code;
# ok !$@;
# print $@ if $@;
#}
$definitions = $parser->parse_uri(
"file://$path/../../../acceptance/wsdl/WSDLParser-import.wsdl"
);
ok my $service = $definitions->first_service();
is $service->get_name(), 'Service1', 'wsdl:import service name';
is $definitions->first_binding()->get_name(), 'Service1Soap', 'wsdl:import binding name';
ok my $schema_from_ref = $definitions->first_types()->get_schema();
is @{ $schema_from_ref }, 2, 'got builtin and imported schema';
ok @{ $schema_from_ref->[1]->get_element } > 0;
is $schema_from_ref->[1]->get_element->[0]->get_name(), 'sayHello';
$SIG{ALRM} = sub { die 'looped'};
alarm 1;
$definitions = $parser->parse_file(
"$path/../../../acceptance/wsdl/WSDLParser_import_loop.wsdl"
);
alarm 0;
pass 'import loop';
__END__
$generator->set_type_prefix('MyTypes');
$generator->set_element_prefix('MyElements');
$generator->set_typemap_prefix('MyTypemaps');
$generator->set_interface_prefix('MyInterfaces');
$generator->set_output(undef);
$generator->generate();
+6 -2
View File
@@ -1,9 +1,13 @@
use strict; use strict;
use warnings; use warnings;
use Test::More tests => 5; use Test::More tests => 6;
use Scalar::Util qw(blessed); use Scalar::Util qw(blessed);
use SOAP::WSDL::Factory::Transport; use SOAP::WSDL::Factory::Transport;
eval { SOAP::WSDL::Factory::Transport->get_transport('') };
like $@, qr{^no transport};
eval { SOAP::WSDL::Factory::Transport->get_transport('zumsl') }; eval { SOAP::WSDL::Factory::Transport->get_transport('zumsl') };
like $@, qr{^no transport}; like $@, qr{^no transport};
@@ -12,7 +16,7 @@ ok blessed $obj;
SOAP::WSDL::Factory::Transport->register('zumsl', 'Hope_You_Have_No_Such_Package_Installed'); SOAP::WSDL::Factory::Transport->register('zumsl', 'Hope_You_Have_No_Such_Package_Installed');
eval { SOAP::WSDL::Factory::Transport->get_transport('zumsl') }; eval { SOAP::WSDL::Factory::Transport->get_transport('zumsl:foo') };
like $@, qr{^Cannot load}; like $@, qr{^Cannot load};
eval { SOAP::WSDL::Factory::Transport->register( \'zumsl', 'Foo') }; eval { SOAP::WSDL::Factory::Transport->register( \'zumsl', 'Foo') };
+5 -3
View File
@@ -11,7 +11,7 @@ eval { require XML::LibXML }
plan skip_all => 'XML::Compile::WSDL11 is not functional yet'; plan skip_all => 'XML::Compile::WSDL11 is not functional yet';
plan tests => qw(no_plan); plan qw(no_plan);
my $path = File::Spec->rel2abs( dirname __FILE__ ); my $path = File::Spec->rel2abs( dirname __FILE__ );
@@ -20,6 +20,8 @@ my $xml = $libxml->parse_file("$path/../../../acceptance/wsdl/generator_test.wsd
my $wsdl = XML::Compile::WSDL11->new($xml); my $wsdl = XML::Compile::WSDL11->new($xml);
my $schemas = $wsdl->schemas; my $schemas = $wsdl->schemas;
my $operation = $wsdl->operation('testHeader'); ok my $operation = $wsdl->operation('testHeader');
my $client = $operation->prepareClient(); #die Dumper $operation;
#
#my $client = $operation->prepareClient();
+13 -2
View File
@@ -1,8 +1,8 @@
use Test::More tests => 38; use Test::More tests => 42;
use File::Basename qw(dirname); use File::Basename qw(dirname);
use File::Spec; use File::Spec;
use File::Path; use File::Path;
use diagnostics;
my $path = File::Spec->rel2abs( dirname __FILE__ ); my $path = File::Spec->rel2abs( dirname __FILE__ );
use_ok qw(SOAP::WSDL::Generator::Visitor::Typelib); use_ok qw(SOAP::WSDL::Generator::Visitor::Typelib);
@@ -149,5 +149,16 @@ is $ct_east->get_testAtomicSimpleTypeElement2->get_value(), 23;
isa_ok($ct_east->get_testAtomicSimpleTypeElement2, isa_ok($ct_east->get_testAtomicSimpleTypeElement2,
'MyTypes::testComplexTypeElementAtomicSimpleType::_testAtomicSimpleTypeElement2'); 'MyTypes::testComplexTypeElementAtomicSimpleType::_testAtomicSimpleTypeElement2');
ok eval { require MyElements::testElementCompletelyEmptyComplex; }
, 'load MyElements::testElementCompletelyEmptyComplex';
ok my $empty = MyElements::testElementCompletelyEmptyComplex->new();
is $empty->serialize_qualified(), '<testElementCompletelyEmptyComplex xmlns="urn:Test"/>'
, 'serialize empty';
ok eval { require MyTypes::testComplexTypeSimpleRestriction; }
, 'load MyTypes::testComplexTypeSimpleRestriction';
rmtree "$path/testlib"; rmtree "$path/testlib";
+100
View File
@@ -0,0 +1,100 @@
use Test::More tests => 12;
use File::Basename qw(dirname);
use File::Spec;
use File::Path;
my $path = File::Spec->rel2abs( dirname __FILE__ );
use_ok qw(SOAP::WSDL::Generator::Visitor::Typelib);
use_ok qw(SOAP::WSDL::Generator::Template::XSD);
use SOAP::WSDL::Expat::WSDLParser;
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
my $definitions = $parser->parse_file(
"$path/../../../acceptance/wsdl/generator_test_dot_names.wsdl"
#"$path/../../../acceptance/wsdl/elementAtomicComplexType.xml"
);
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
definitions => $definitions,
type_prefix => 'Foo',
element_prefix => 'Foo',
typemap_prefix => 'Foo',
OUTPUT_PATH => "$path/testlib",
});
my $code = "";
$generator->set_output(\$code);
$generator->generate_typelib();
{
eval $code;
ok !$@;
print $@ if $@;
}
# print $code;
$generator->set_type_prefix('MyTypes');
$generator->set_element_prefix('MyElements');
$generator->set_typemap_prefix('MyTypemaps');
$generator->set_interface_prefix('MyInterfaces');
$generator->set_output(undef);
$generator->generate();
#$generator->generate_typelib();
#$generator->generate_typemap();
if (eval { require Test::Warn; }) {
Test::Warn::warning_like( sub { $generator->generate_interface() },
qr{\A Multiple \s parts \s detected \s in \s message \s testMultiPartWarning}xms);
}
else {
$generator->generate_interface();
SKIP: { skip 'Cannot test warnings without Test::Warn', 1 };
}
$generator->generate_server();
eval "use lib '$path/testlib'";
use_ok qw(MyInterfaces::My::SOAP::testService::testPort);
use_ok qw(MyServer::My::SOAP::testService::testPort);
SKIP: {
eval { require Test::Pod::Content; }
or skip 'Cannot test pod content without Test::Pod::Content', 6;
Test::Pod::Content::pod_section_like(
'MyInterfaces::My::SOAP::testService::testPort',
'NAME',
qr{^MyInterfaces::My::SOAP::testService::testPort \s - \s}xms,
'Pod NAME section');
Test::Pod::Content::pod_section_like(
'MyInterfaces::My::SOAP::testService::testPort',
'SYNOPSIS',
qr{use \s MyInterfaces::My::SOAP::testService::testPort}xms,
'Pod SYNOPSIS section');
Test::Pod::Content::pod_section_like(
'MyInterfaces::My::SOAP::testService::testPort',
'SYNOPSIS',
qr{\s MyInterfaces::My::SOAP::testService::testPort->new\(}xms,
'Pod SYNOPSIS section');
Test::Pod::Content::pod_section_like(
'MyServer::My::SOAP::testService::testPort',
'NAME',
qr{^MyServer::My::SOAP::testService::testPort \s - \s}xms,
'Pod NAME section');
Test::Pod::Content::pod_section_like(
'MyServer::My::SOAP::testService::testPort',
'SYNOPSIS',
qr{use \s MyServer::My::SOAP::testService::testPort}xms,
'Pod SYNOPSIS section');
Test::Pod::Content::pod_section_like(
'MyServer::My::SOAP::testService::testPort',
'SYNOPSIS',
qr{\s MyServer::My::SOAP::testService::testPort->new\(}xms,
'Pod SYNOPSIS section');
}
rmtree "$path/testlib";
+32
View File
@@ -0,0 +1,32 @@
use strict;
use warnings;
use Test::More tests => 4;
use SOAP::WSDL::Operation;
use_ok qw(SOAP::WSDL::PortType);
my $portType = SOAP::WSDL::PortType->new({
operation => [
SOAP::WSDL::Operation->new({
name => 'foo',
targetNamespace => 'bar',
}),
SOAP::WSDL::Operation->new({
name => 'foo',
targetNamespace => 'baz',
}),
SOAP::WSDL::Operation->new({
name => 'foobar',
targetNamespace => 'bar',
}),
]
});
my $operation = $portType->find_operation('bar', 'foobar');
is $operation->get_name(), 'foobar', 'found operation';
$operation = $portType->find_operation('baz', 'foo');
is $operation->get_name(), 'foo', 'found operation';
$operation = $portType->find_operation('baz', 'foobar');
is $operation, undef, 'find_operation returns undef on unknown operation';
+7
View File
@@ -11,3 +11,10 @@ like $serializer->serialize({ body => {} }), qr{<SOAP-ENV:Body></SOAP-ENV:Body>}
like $serializer->serialize({ body => [] }), qr{<SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty body'; like $serializer->serialize({ body => [] }), qr{<SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty body';
like $serializer->serialize({ header => {}, body => [] }), like $serializer->serialize({ header => {}, body => [] }),
qr{<SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty header and body'; qr{<SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty header and body';
like $serializer->serialize({ header => {}, body => [] , options => {
namespace => {
'http://schemas.xmlsoap.org/soap/envelope/' => 'SOAP',
'http://www.w3.org/2001/XMLSchema-instance' => 'xsi',
}
} }),
qr{<SOAP:Header></SOAP:Header><SOAP:Body></SOAP:Body>}, 'empty header and body';
+5
View File
@@ -55,8 +55,13 @@ eval { $server->handle($request) };
like $@, qr{\A Not \s implemented:}x, 'Not implemented fault caught'; like $@, qr{\A Not \s implemented:}x, 'Not implemented fault caught';
$server->set_action_map_ref({ Test => 'test'});
ok $server->handle($request);
$server->set_deserializer('MyDeserializer2'); $server->set_deserializer('MyDeserializer2');
eval { $server->handle(HTTP::Request->new()) }; eval { $server->handle(HTTP::Request->new()) };
like $@, qr{\A Error \s deserializing}x, 'Error deserializing caught'; like $@, qr{\A Error \s deserializing}x, 'Error deserializing caught';
sub test {
return;
}
+94 -32
View File
@@ -11,7 +11,7 @@ use Test::More;
eval "require IO::Scalar" eval "require IO::Scalar"
or plan skip_all => 'IO::Scalar required for testing...'; or plan skip_all => 'IO::Scalar required for testing...';
plan tests => 8; plan tests => 12;
use_ok(SOAP::WSDL::Server); use_ok(SOAP::WSDL::Server);
use_ok(SOAP::WSDL::Server::CGI); use_ok(SOAP::WSDL::Server::CGI);
@@ -30,51 +30,113 @@ $server->set_action_map_ref({
my $output = q{}; my $output = q{};
my $fh = IO::Scalar->new(\$output); my $fh = IO::Scalar->new(\$output);
my $stdout = *STDOUT; my $stdout = *STDOUT;
my $stdin = *STDIN;
*STDOUT = $fh; *STDOUT = $fh;
{
local %ENV;
$server->handle();
$server->handle(); like $output, qr{ \A Status: \s 411 \s Length \s Required}x;
$output = q{};
like $output, qr{ \A Status: \s 411 \s Length \s Required}x; $ENV{'CONTENT_LENGTH'} = '0e0';
$output = q{}; $server->handle();
$ENV{'CONTENT_LENGTH'} = '0e0'; like $output, qr{ Error \s deserializing }xsm;
$server->handle(); $output = q{};
like $output, qr{ Error \s deserializing }xsm; $server->set_action_map_ref({
$output = q{}; 'foo' => 'bar',
});
$server->set_dispatch_to( 'HandlerClass' );
$server->set_action_map_ref({ $server->handle();
'foo' => 'bar', like $output, qr{no \s element \s found}xms;
}); $output = q{};
$server->set_dispatch_to( 'HandlerClass' );
$server->handle(); $ENV{REQUEST_METHOD} = 'POST';
like $output, qr{no \s element \s found}xms; $ENV{HTTP_SOAPACTION} = 'test';
$output = q{}; $server->handle();
like $output, qr{no \s element \s found}xms;
$output = q{};
$ENV{REQUEST_METHOD} = 'POST'; delete $ENV{HTTP_SOAPACTION};
$ENV{HTTP_SOAPACTION} = 'test';
$server->handle();
like $output, qr{no \s element \s found}xms;
$output = q{};
delete $ENV{HTTP_SOAPACTION}; $ENV{EXPECT} = 'Foo';
$ENV{HTTP_SOAPAction} = 'foo';
$server->handle();
$ENV{EXPECT} = 'Foo'; like $output, qr{no \s element \s found}xms;
$ENV{HTTP_SOAPAction} = 'foo'; $output = q{};
$server->handle();
like $output, qr{no \s element \s found}xms; $ENV{EXPECT} = '100-Continue';
$output = q{}; $ENV{HTTP_SOAPAction} = 'foo';
$server->handle();
like $output, qr{100 \s Continue}xms;
$output = q{};
$ENV{EXPECT} = '100-Continue'; delete $ENV{EXPECT};
$ENV{HTTP_SOAPAction} = 'foo';
$server->handle(); my $input = 'Foobar';
like $output, qr{100 \s Continue}xms; my $ih = IO::Scalar->new(\$input);
$output = q{}; $ih->seek(0);
*STDIN = $ih;
# my $buffer;
# read(*STDIN, $buffer, 6);
# die $buffer;
$ENV{HTTP_SOAPAction} = 'bar';
$ENV{CONTENT_LENGTH} = 6;
$server->handle();
like $output, qr{ Error \s deserializing \s message}xms;
$output = q{};
$ih->seek(0);
$input = q{<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>};
$ENV{HTTP_SOAPAction} = 'bar';
$ENV{CONTENT_LENGTH} = length $input;
$server->handle();
# die $output;
like $output, qr{ Not \s found:}xms;
$output = q{};
$ih->seek(0);
$server->set_dispatch_to( 'HandlerClass' );
$server->set_action_map_ref({
'bar' => 'bar',
});
$input = q{<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>};
$ENV{HTTP_SOAPAction} = q{"bar"};
$ENV{CONTENT_LENGTH} = length $input;
$server->handle();
use Data::Dumper;
like $output, qr{ \A Status: \s 200 \s OK}xms;
$output = q{};
$ih->seek(0);
$server->set_dispatch_to( 'HandlerClass' );
$server->set_action_map_ref({
'bar' => 'bar',
});
$input = q{<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>};
$ENV{SERVER_SOFTWARE} ='IIS Foobar';
$ENV{HTTP_SOAPAction} = q{"bar"};
$ENV{CONTENT_LENGTH} = length $input;
$server->handle();
use Data::Dumper;
like $output, qr{ \A HTTP/1.0 \s 200 \s OK}xms;
$output = q{};
$ih->seek(0);
}
# restore handles
*STDOUT = $stdout; *STDOUT = $stdout;
*STDIN = $stdin;
# print $output; # print $output;
+40
View File
@@ -0,0 +1,40 @@
use strict;
use warnings;
use Test::More tests => 2; #qw(no_plan);
use_ok qw(SOAP::WSDL::XSD::Attribute);
use SOAP::WSDL::Expat::WSDLParser;
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
my $xml = q{<s:schema elementFormDefault="qualified"
targetNamespace="urn:HelloWorld" xmlns:s="http://www.w3.org/2001/XMLSchema">
<s:element name="sayHello">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name"
type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="givenName"
type="s:string" nillable="1" />
</s:sequence>
<s:attribute name="testAttr" type="s:string" use="optional"></s:attribute>
</s:complexType>
</s:element>
<s:element name="sayHelloResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="sayHelloResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
};
my $schema = $parser->parse($xml);
is $schema->find_element('urn:HelloWorld', 'sayHello')
->first_complexType()
->first_attribute()->get_name(),
'testAttr', 'found attribute';
+1 -1
View File
@@ -5,7 +5,7 @@ use Test::More tests => 2; #qw(no_plan);
use_ok qw(SOAP::WSDL::XSD::ComplexType); use_ok qw(SOAP::WSDL::XSD::ComplexType);
my $obj = SOAP::WSDL::XSD::ComplexType->new(); my $obj = SOAP::WSDL::XSD::ComplexType->new();
$obj->set_flavor('extension'); $obj->set_variety('extension');
eval { $obj->serialize('foo') }; eval { $obj->serialize('foo') };
like $@, qr{sorry, \s we \s just}xsm; like $@, qr{sorry, \s we \s just}xsm;
+12 -2
View File
@@ -1,11 +1,11 @@
package Foo; package Foo;
sub serialize { sub serialize {
return "serialized $_[1] $_[2]"; return "serialized $_[1] $_[2]" . join ' ', @{$_[3]->{ attributes } || [] } if $_[3];
} }
package main; package main;
use strict; use strict;
use warnings; use warnings;
use Test::More tests => 12; use Test::More tests => 16;
use_ok qw(SOAP::WSDL::XSD::Element); use_ok qw(SOAP::WSDL::XSD::Element);
@@ -16,6 +16,9 @@ is $element->first_simpleType(), undef;
$element->set_simpleType('Foo'); $element->set_simpleType('Foo');
is $element->first_simpleType(), 'Foo'; is $element->first_simpleType(), 'Foo';
is $element->serialize('Foobar', 'Bar', { namespace => {} } ), 'serialized Foobar Bar';
is $element->serialize('Foobar', undef, { namespace => {} } ), 'serialized Foobar ';
$element->set_simpleType( [ 'Foo', 'Bar' ]); $element->set_simpleType( [ 'Foo', 'Bar' ]);
is $element->first_simpleType(), 'Foo'; is $element->first_simpleType(), 'Foo';
@@ -30,6 +33,13 @@ is $element->first_complexType(), 'Foo';
$element->set_default('Foo'); $element->set_default('Foo');
is $element->serialize('Foobar', undef, { namespace => {} } ), 'serialized Foobar Foo'; is $element->serialize('Foobar', undef, { namespace => {} } ), 'serialized Foobar Foo';
$element->set_targetNamespace('urn:foobar');
is $element->serialize('Foobar', undef, { namespace => {}, qualify => 1 } ), 'serialized Foobar Foo xmlns="urn:foobar"';
$element->set_targetNamespace('urn:foobar');
is $element->serialize('Foobar', 'Bar', { namespace => {}, qualify => 1 } ), 'serialized Foobar Bar xmlns="urn:foobar"';
$element->set_name('Bar'); $element->set_name('Bar');
is $element->serialize(undef, undef, { namespace => {} } ), 'serialized Bar Foo'; is $element->serialize(undef, undef, { namespace => {} } ), 'serialized Bar Foo';
+32
View File
@@ -0,0 +1,32 @@
use strict;
use warnings;
use Test::More tests => 4;
use SOAP::WSDL::XSD::Element;
use_ok qw(SOAP::WSDL::XSD::Schema);
my $obj = SOAP::WSDL::XSD::Schema->new({
element => [
SOAP::WSDL::XSD::Element->new({
name => 'foo',
targetNamespace => 'bar',
}),
SOAP::WSDL::XSD::Element->new({
name => 'foo',
targetNamespace => 'baz',
}),
SOAP::WSDL::XSD::Element->new({
name => 'foobar',
targetNamespace => 'bar',
}),
]
});
my $found= $obj->find_element('bar', 'foobar');
is $found->get_name(), 'foobar', 'found Element';
$found = $obj->find_element('baz', 'foo');
is $found->get_name(), 'foo', 'found Element';
$found = $obj->find_element('baz', 'foobar');
is $found, undef, 'find_Element returns undef on unknown Element';
+7
View File
@@ -0,0 +1,7 @@
use strict;
use warnings;
use Test::More tests => 3; #qw(no_plan);
use_ok qw(SOAP::WSDL::XSD::Typelib::Attribute);
is SOAP::WSDL::XSD::Typelib::Attribute->start_tag(), '';
is SOAP::WSDL::XSD::Typelib::Attribute->start_tag({ name => 'foo'}, 'bar'), q{ foo="};
@@ -24,8 +24,8 @@ is $obj->get_value(), 'test1', 'get_value';
is $obj->get_xmlns(), 'http://www.w3.org/2001/XMLSchema', 'get_xmlns'; is $obj->get_xmlns(), 'http://www.w3.org/2001/XMLSchema', 'get_xmlns';
is $obj->start_tag({ name => 'test' }), '<test >', 'start_tag'; is $obj->start_tag({ name => 'test' }), '<test>', 'start_tag';
is $obj->end_tag({ name => 'test' }), '</test >', 'end_tag'; is $obj->end_tag({ name => 'test' }), '</test>', 'end_tag';
ok $obj->set_value('test'), 'set_value'; ok $obj->set_value('test'), 'set_value';
is $obj->get_value(), 'test', 'get_value'; is $obj->get_value(), 'test', 'get_value';
@@ -54,7 +54,7 @@ is $obj->get_value(), 'test2', 'get_value on attr value';
$obj->set_value(undef); $obj->set_value(undef);
is $obj->serialize({ name => 'foo' }), '<foo ></foo >' is $obj->serialize({ name => 'foo' }), '<foo></foo>'
, 'serialize undef value with name'; , 'serialize undef value with name';
is $obj->serialize(), q{}, 'serialize undef value without name'; is $obj->serialize(), q{}, 'serialize undef value without name';
+3 -2
View File
@@ -1,13 +1,14 @@
use strict; use strict;
use warnings; use warnings;
use Test::More tests => 3; use Test::More tests => 5;
use Scalar::Util qw(blessed); use Scalar::Util qw(blessed);
use_ok qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType); use_ok qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->get_xmlns(), 'http://www.w3.org/2001/XMLSchema', 'get_xmlns'; is SOAP::WSDL::XSD::Typelib::Builtin::anyType->get_xmlns(), 'http://www.w3.org/2001/XMLSchema', 'get_xmlns';
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->serialize(), q{}, 'serialize to empty'; is SOAP::WSDL::XSD::Typelib::Builtin::anyType->serialize(), q{}, 'serialize to empty';
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->start_tag(), q{}, 'serialize to empty';
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->start_tag({ name => 'foo'}), q{<foo>}, 'serialize with name';
exit 0; exit 0;
__END__ __END__
+1 -1
View File
@@ -46,7 +46,7 @@ is "$bool", '0', 'stringification';
ok $bool->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType'), 'inheritance'; ok $bool->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType'), 'inheritance';
is $bool->serialize({ name => 'test'}), '<test >false</test >'; is $bool->serialize({ name => 'test'}), '<test>false</test>';
is $bool->serialize(), 'false'; is $bool->serialize(), 'false';
$bool->delete_value(); $bool->delete_value();
@@ -20,5 +20,5 @@ is $obj->serialize, '&amp; &quot;Aber&quot; &lt;test&gt;'
, 'escape text on serialization'; , 'escape text on serialization';
is $obj->serialize({ name => 'test'}) is $obj->serialize({ name => 'test'})
, '<test >&amp; &quot;Aber&quot; &lt;test&gt;</test >' , '<test>&amp; &quot;Aber&quot; &lt;test&gt;</test>'
, 'Serialization with name'; , 'Serialization with name';
+1 -1
View File
@@ -19,5 +19,5 @@ is $obj->serialize(), '&amp; &quot;Aber&quot; &lt;test&gt;'
, 'escape text on serialization'; , 'escape text on serialization';
is $obj->serialize({ name => 'test'}) is $obj->serialize({ name => 'test'})
, '<test >&amp; &quot;Aber&quot; &lt;test&gt;</test >' , '<test>&amp; &quot;Aber&quot; &lt;test&gt;</test>'
, 'Serialization with name'; , 'Serialization with name';
+93 -40
View File
@@ -9,22 +9,48 @@ package MyEmptyType2;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
__PACKAGE__->_factory(); __PACKAGE__->_factory();
package MyType; package MyAttribute;
use base qw(SOAP::WSDL::XSD::Typelib::Attribute
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); SOAP::WSDL::XSD::Typelib::Builtin::string
my %test_of :ATTR(:get<test>);
__PACKAGE__->_factory(
[ 'test' ],
{
test => \%test_of,
},
{
test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
); );
package MyType;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
{
my %test_of :ATTR(:get<test>);
__PACKAGE__->_factory(
[ 'test' ],
{ test => \%test_of, },
{ test => 'SOAP::WSDL::XSD::Typelib::Builtin::string', }
);
}
package MyElement;
use base qw(
SOAP::WSDL::XSD::Typelib::Element
MyType
);
__PACKAGE__->__set_name( 'MyElement' );
package MyElement::_ATTR;
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
{
my %test_of :ATTR(:get<test>);
my %test2_of :ATTR(:get<test2>);
__PACKAGE__->_factory(
[ 'test', 'test2' ],
{
test => \%test_of,
test2 => \%test2_of,
},
{
test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
test2 => 'MyAttribute',
}
);
}
package MyType2; package MyType2;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
@@ -42,21 +68,18 @@ __PACKAGE__->_factory(
); );
package main; package main;
use Test::More tests => 100; use Test::More tests => 109;
use Storable; use Storable;
my $have_warn = eval { require Test::Warn; import Test::Warn; 1; }; my $have_warn = eval { require Test::Warn; import Test::Warn; 1; };
my $obj; my $obj;
$obj = MyEmptyType->new(); for my $class (qw{MyEmptyType MyEmptyType2}) {
is $obj->serialize, ''; $obj = $class->new();
is $obj->serialize({ name => 'test'}), '<test />'; is $obj->serialize, '', "$class object serializes to q{}";
is $obj->serialize({ name => 'test'}), '<test/>', "$class object serializes to <test/> with name=test";
$obj = MyEmptyType2->new(); }
is $obj->serialize, '';
is $obj->serialize({ name => 'test'}), '<test />';
$obj = MyType->new({}); $obj = MyType->new({});
isa_ok $obj, 'MyType'; isa_ok $obj, 'MyType';
@@ -80,6 +103,7 @@ $obj = MyType->new({
value => 'Test2' value => 'Test2'
}) })
}); });
isa_ok $obj, 'MyType'; isa_ok $obj, 'MyType';
isa_ok $obj->get_test, 'SOAP::WSDL::XSD::Typelib::Builtin::string'; isa_ok $obj->get_test, 'SOAP::WSDL::XSD::Typelib::Builtin::string';
is $obj->get_test, 'Test2', 'element content'; is $obj->get_test, 'Test2', 'element content';
@@ -105,6 +129,7 @@ $obj = MyType->new({
}) })
], ],
}); });
isa_ok $obj, 'MyType'; isa_ok $obj, 'MyType';
isa_ok $obj->get_test, 'ARRAY'; isa_ok $obj->get_test, 'ARRAY';
is $obj->get_test()->[0], 'Test', 'element content (list content [0])'; is $obj->get_test()->[0], 'Test', 'element content (list content [0])';
@@ -139,13 +164,10 @@ $nested = MyType2->new({
}, },
}); });
$hash_of_ref = $nested->as_hash_ref(); $hash_of_ref = $nested->as_hash_ref();
is $hash_of_ref->{ test }->{ test }->[1], 'Test2'; is $hash_of_ref->{ test }->{ test }->[1], 'Test2';
# isnt $nested->get_test->[0], $obj, 'element identity';
$obj = MyType->new(); $obj = MyType->new();
isa_ok $obj, 'MyType'; isa_ok $obj, 'MyType';
is $obj->get_test, undef, 'undefined element content'; is $obj->get_test, undef, 'undefined element content';
@@ -168,7 +190,32 @@ for my $count (1..5) {
} }
} }
# TODO - remove after *{ "$class\::$name"" } methods are gone $obj->set_test();
is $obj->get_test, (), 'removed element content';
$obj = MyEmptyType->new();
eval {
isa_ok $obj->attr() , 'SOAP::WSDL::XSD::Typelib::AttributeSet';
};
like $@, qr{\s has \s no \s attributes}x;
$obj = MyElement->new();
isa_ok $obj->attr() , 'SOAP::WSDL::XSD::Typelib::AttributeSet';
my $attr = $obj->attr({ test => 'TestAttribute',
test2 => 'TestAttribute2'
});
isa_ok $attr, 'SOAP::WSDL::XSD::Typelib::AttributeSet';
is $attr->serialize(), q{ test="TestAttribute" test2="TestAttribute2"}, 'attribute serialization';
is $obj->serialize(),
q{<MyElement test="TestAttribute" test2="TestAttribute2"/>},
'Serialization with attributes';
$obj->attr()->set_test2('test');
is $obj->serialize(),
q{<MyElement test="TestAttribute" test2="test"/>},
'Serialization with attributes';
$obj = MyType->new(); $obj = MyType->new();
@@ -181,14 +228,12 @@ is $obj->get_test, undef;
eval { $foo = @{ $obj->get_test() } }; eval { $foo = @{ $obj->get_test() } };
if (! $@) { if (! $@) {
is $foo, undef; is $foo, undef;
# like $warnings, qr{ uninitialized \s value \s in array \s dereference }x, 'undef warning';
} }
else { else {
like $@ , qr{Can't \s use \s an \s undefined}x, 'get_ELEMENT still undef on ARRAYIFY'; like $@ , qr{Can't \s use \s an \s undefined}x, 'get_ELEMENT still undef on ARRAYIFY';
# pass 'failed array dereference';
} }
$obj->test( $obj->set_test(
SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'TestString0'}) SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'TestString0'})
); );
} }
@@ -197,15 +242,15 @@ eval { is @{ $obj->get_test() }, 1, 'ARRAYIFY get_ELEMENT' };
fail 'cannot ARRAYIFY get_ELEMENT' if ($@); fail 'cannot ARRAYIFY get_ELEMENT' if ($@);
my @serialized = ( my @serialized = (
'<test >TestString0</test ><test >TestString1</test >', '<test>TestString0</test><test>TestString1</test>',
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test >', '<test>TestString0</test><test>TestString1</test><test>TestString2</test>',
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test ><test >TestString3</test >', '<test>TestString0</test><test>TestString1</test><test>TestString2</test><test>TestString3</test>',
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test ><test >TestString3</test ><test >TestString4</test >', '<test>TestString0</test><test>TestString1</test><test>TestString2</test><test>TestString3</test><test>TestString4</test>',
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test ><test >TestString3</test ><test >TestString4</test ><test >TestString5</test >', '<test>TestString0</test><test>TestString1</test><test>TestString2</test><test>TestString3</test><test>TestString4</test><test>TestString5</test>',
); );
for my $count (1..5) { for my $count (1..5) {
$obj->test( $obj->add_test(
SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => "TestString$count" }) SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => "TestString$count" })
); );
@@ -219,6 +264,10 @@ for my $count (1..5) {
} }
my $clone = Storable::thaw( Storable::freeze( $obj ));
is $clone->get_test()->[0], 'TestString0';
## failure tests
eval { eval {
$obj = MyType->new({ $obj = MyType->new({
@@ -240,6 +289,13 @@ eval {
}; };
like $@, qr{cannot \s use \s CODE}xms; like $@, qr{cannot \s use \s CODE}xms;
# TODO ignore XMLNS (for now)
$obj = MyType->new({ xmlns => 'fubar'});
ok defined $obj;
TODO: {
local $TODO = "Support XML namespaces";
is $obj->get_xmlns(), 'fubar';
}
eval { eval {
$obj = MyType->new({ $obj = MyType->new({
@@ -258,16 +314,13 @@ like $@, qr{Can't \s locate \s object \s method}x;
eval { MyType->new({ FOO => 42 }) }; eval { MyType->new({ FOO => 42 }) };
like $@, qr{unknown \s field \s}xm; like $@, qr{unknown \s field \s}xm;
my $clone = Storable::thaw( Storable::freeze( $obj ));
is $clone->get_test()->[0], 'TestString0';
eval { SOAP::WSDL::XSD::Typelib::ComplexType::AUTOMETHOD() }; eval { SOAP::WSDL::XSD::Typelib::ComplexType::AUTOMETHOD() };
like $@, qr{Cannot \s call}xm; like $@, qr{Cannot \s call}xm;
eval { SOAP::WSDL::XSD::Typelib::ComplexType->_factory([], { test => {} }, {}) }; eval { SOAP::WSDL::XSD::Typelib::ComplexType->_factory([], { test => {} }, {}) };
like $@, qr{ No \s class \s given \s for \s }xms; like $@, qr{ No \s class \s given \s for \s }xms;
eval { SOAP::WSDL::XSD::Typelib::ComplexType->_factory([], { test => {} }, { test => 'HopeItDoesntExistOnYourSystem'}) }; eval { SOAP::WSDL::XSD::Typelib::ComplexType->_factory([], { test => {} }, { test => 'HopeItDoesntExistOnYourSystem'}) };
like $@, qr{ Can't \s locate \s HopeItDoesntExistOnYourSystem.pm }xms; like $@, qr{ Can't \s locate \s HopeItDoesntExistOnYourSystem.pm }xms;
# print Dumper
+4 -4
View File
@@ -10,7 +10,7 @@ __PACKAGE__->__set_name('MyElement');
__PACKAGE__->__set_nillable(1); __PACKAGE__->__set_nillable(1);
package main; package main;
use Test::More tests => 11; use Test::More tests => 12;
my $obj; my $obj;
@@ -25,8 +25,8 @@ isa_ok $obj, 'MyElement';
is $obj->get_value(), 'Test'; is $obj->get_value(), 'Test';
$obj->set_value(undef); $obj->set_value(undef);
is $obj->serialize_qualified, '<MyElement xsi:nil="true" xmlns="http://www.w3.org/2001/XMLSchema" />'; is $obj->serialize_qualified, '<MyElement xsi:nil="true" xmlns="http://www.w3.org/2001/XMLSchema"/>';
is $obj->serialize, '<MyElement xsi:nil="true"/>';
$obj->__set_nillable(0); $obj->__set_nillable(0);
is $obj->__get_nillable(), 0; is $obj->__get_nillable(), 0;
@@ -35,7 +35,7 @@ like $@, qr{Cannot \s call}xms;
eval { SOAP::WSDL::XSD::Typelib::Element::__set_nillable() }; eval { SOAP::WSDL::XSD::Typelib::Element::__set_nillable() };
like $@, qr{Cannot \s call}xms; like $@, qr{Cannot \s call}xms;
is $obj->start_tag({empty => 1}), '<MyElement />'; is $obj->start_tag({empty => 1}), '<MyElement/>';
is $obj->start_tag({nil => 1}), '', 'empty string with nil option and NILLABLE false'; is $obj->start_tag({nil => 1}), '', 'empty string with nil option and NILLABLE false';
$obj->set_value('Test'); $obj->set_value('Test');
+20
View File
@@ -0,0 +1,20 @@
<?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/">
<import namespace="urn:HelloWorld" location="WSDLParser-imported.wsdl"/>
<service name="Service1">
<port name="Service1Soap" binding="s0:Service1Soap">
<soap:address
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
</port>
</service>
</definitions>
@@ -0,0 +1,52 @@
<?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>
<s:import namespace="urn:HelloWorld" schemaLocation="import.xsd"/>
</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>
</definitions>
+77
View File
@@ -0,0 +1,77 @@
<?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:attribute name="testAttr" type="s:string" use="optional"></s:attribute>
</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: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="Service1">
<port name="Service1Soap" binding="s0:Service1Soap">
<soap:address
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
</port>
</service>
</definitions>
@@ -0,0 +1,60 @@
<?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>
<s:import namespace="urn:HelloWorld" schemaLocation="import_loop.xsd"/>
</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="Service1">
<port name="Service1Soap" binding="s0:Service1Soap">
<soap:address
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
</port>
</service>
</definitions>
+700
View File
@@ -0,0 +1,700 @@
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://stub.query.gasapiserver.esp.globalsign.com"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://stub.query.gasapiserver.esp.globalsign.com"
xmlns:intf="http://stub.query.gasapiserver.esp.globalsign.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDLはApache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)によって生成されました / [en]-(WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT))-->
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://stub.query.gasapiserver.esp.globalsign.com" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="GetDVApproverList">
<complexType>
<sequence>
<element name="Request" type="impl:GetDVApproverListRequest"/>
</sequence>
</complexType>
</element>
<complexType name="AuthToken">
<sequence>
<element name="Password" nillable="true" type="xsd:string"/>
<element name="UserName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="QueryRequestHeader">
<sequence>
<element name="AuthToken" nillable="true" type="impl:AuthToken"/>
</sequence>
</complexType>
<complexType name="GetDVApproverListRequest">
<sequence>
<element name="FQDN" nillable="true" type="xsd:string"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
</sequence>
</complexType>
<element name="GetDVApproverListResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetDVApproverListResponse"/>
</sequence>
</complexType>
</element>
<complexType name="Approver">
<sequence>
<element maxOccurs="1" minOccurs="0" name="ApproverEmail" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ApproverType" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfApprover">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="Approver" type="impl:Approver"/>
</sequence>
</complexType>
<complexType name="Error">
<sequence>
<element maxOccurs="1" minOccurs="0" name="ErrorCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ErrorField" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ErrorMessage" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfError">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="Error" type="impl:Error"/>
</sequence>
</complexType>
<complexType name="QueryResponseHeader">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Errors" nillable="true" type="impl:ArrayOfError"/>
<element maxOccurs="1" minOccurs="0" name="ReturnCount" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SuccessCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Timestamp" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<complexType name="GetDVApproverListResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Approvers" nillable="true" type="impl:ArrayOfApprover"/>
<element maxOccurs="1" minOccurs="0" name="OrderID" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
</sequence>
</complexType>
<element name="GetApproverList">
<complexType>
<sequence>
<element name="Request" type="impl:GetApproverListRequest"/>
</sequence>
</complexType>
</element>
<complexType name="GetApproverListRequest">
<sequence>
<element name="FQDN" nillable="true" type="xsd:string"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
</sequence>
</complexType>
<element name="GetApproverListResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetApproverListResponse"/>
</sequence>
</complexType>
</element>
<complexType name="GetApproverListResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Approvers" nillable="true" type="impl:ArrayOfApprover"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
</sequence>
</complexType>
<element name="GetOrderByOrderID">
<complexType>
<sequence>
<element name="Request" type="impl:GetOrderByOrderIDRequest"/>
</sequence>
</complexType>
</element>
<complexType name="OrderQueryOption">
<sequence>
<element maxOccurs="1" minOccurs="0" name="OrderStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ReturnCACerts" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ReturnCertificateInfo" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ReturnFulfillment" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ReturnOrderOption" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="GetOrderByOrderIDRequest">
<sequence>
<element name="OrderID" nillable="true" type="xsd:string"/>
<element name="OrderQueryOption" nillable="true" type="impl:OrderQueryOption"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
</sequence>
</complexType>
<element name="GetOrderByOrderIDResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetOrderByOrderIDResponse"/>
</sequence>
</complexType>
</element>
<complexType name="CertificateInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="DNSNames" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="CertificateStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="CommonName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="EndDate" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SerialNumber" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="StartDate" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SubjectName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="CACertificate">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CACert" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="CACertType" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfCACertificate">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="CACertificate" type="impl:CACertificate"/>
</sequence>
</complexType>
<complexType name="ServerCertificate">
<sequence>
<element maxOccurs="1" minOccurs="0" name="PKCS7Cert" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="X509Cert" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="Fulfillment">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CACertificates" nillable="true" type="impl:ArrayOfCACertificate"/>
<element maxOccurs="1" minOccurs="0" name="ServerCertificate" nillable="true" type="impl:ServerCertificate"/>
</sequence>
</complexType>
<complexType name="ModificationEvent">
<sequence>
<element maxOccurs="1" minOccurs="0" name="ModificationEventName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ModificationEventTimestamp" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<complexType name="ArrayOfModificationEvent">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="ModificationEvent" type="impl:ModificationEvent"/>
</sequence>
</complexType>
<complexType name="ValidityPeriod">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Months" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="NotAfter" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="NotBefore" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<complexType name="OrderInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="GSSupportOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="BaseOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Currency" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="DomainName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ExpressOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="InsuranceOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Licenses" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderCanceledDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderCompleteDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderDeactivatedDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderID" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderKind" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Price" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ProductCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="RenewalExtentionOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SpecialInstructions" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ValidityPeriod" nillable="true" type="impl:ValidityPeriod"/>
<element maxOccurs="1" minOccurs="0" name="ValidityPeriodCustomizeOption" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ContactInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Email" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FirstName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="LastName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="OrganizationAddress">
<sequence>
<element maxOccurs="1" minOccurs="0" name="AddressLine1" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="AddressLine2" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="AddressLine3" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="City" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Country" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Fax" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="PostalCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Region" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="OrganizationInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CreditAgency" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationAddress" nillable="true" type="impl:OrganizationAddress"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="BusinessAssumedName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="BusinessCategoryCode" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ApproverInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Email" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FirstName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Function" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="LastName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationUnit" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="AuthorizedSignerInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Email" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FirstName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Function" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="LastName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationUnit" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="JurisdictionInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Country" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="IncorporatingAgencyRegistrationNumber" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Locality" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="StateOrProvince" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="RequestorInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Email" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FirstName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Function" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="LastName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationUnit" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="OrderOption">
<sequence>
<element maxOccurs="1" minOccurs="0" name="ApproverConfirmDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="ApproverEmailAddress" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ApproverNotifiedDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="ContactInfo" nillable="true" type="impl:ContactInfo"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationInfo" nillable="true" type="impl:OrganizationInfo"/>
<element maxOccurs="1" minOccurs="0" name="ApproverInfo" nillable="true" type="impl:ApproverInfo"/>
<element maxOccurs="1" minOccurs="0" name="AuthorizedSignerInfo" nillable="true" type="impl:AuthorizedSignerInfo"/>
<element maxOccurs="1" minOccurs="0" name="JurisdictionInfo" nillable="true" type="impl:JurisdictionInfo"/>
<element maxOccurs="1" minOccurs="0" name="RequestorInfo" nillable="true" type="impl:RequestorInfo"/>
</sequence>
</complexType>
<complexType name="OrderSubInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CSRSkipOrderFlag" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="DNSOrderFlag" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="P12DeleteDate" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="P12DeleteStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SubId" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="TrustedOrderFlag" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="VerificationUrl" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="OrderDetail">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CertificateInfo" nillable="true" type="impl:CertificateInfo"/>
<element maxOccurs="1" minOccurs="0" name="Fulfillment" nillable="true" type="impl:Fulfillment"/>
<element maxOccurs="1" minOccurs="0" name="ModificationEvents" nillable="true" type="impl:ArrayOfModificationEvent"/>
<element maxOccurs="1" minOccurs="0" name="OrderInfo" nillable="true" type="impl:OrderInfo"/>
<element maxOccurs="1" minOccurs="0" name="OrderOption" nillable="true" type="impl:OrderOption"/>
<element maxOccurs="1" minOccurs="0" name="OrderSubInfo" nillable="true" type="impl:OrderSubInfo"/>
</sequence>
</complexType>
<complexType name="GetOrderByOrderIDResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="OrderDetail" nillable="true" type="impl:OrderDetail"/>
<element maxOccurs="1" minOccurs="0" name="OrderID" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
<element name="PKCS12File" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<element name="GetModifiedOrders">
<complexType>
<sequence>
<element name="Request" type="impl:GetModifiedOrdersRequest"/>
</sequence>
</complexType>
</element>
<complexType name="GetModifiedOrdersRequest">
<sequence>
<element name="FromDate" nillable="true" type="xsd:dateTime"/>
<element name="OrderQueryOption" nillable="true" type="impl:OrderQueryOption"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
<element name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetModifiedOrdersResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetModifiedOrdersResponse"/>
</sequence>
</complexType>
</element>
<complexType name="ArrayOfOrderDetail">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="OrderDetail" type="impl:OrderDetail"/>
</sequence>
</complexType>
<complexType name="GetModifiedOrdersResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="FromDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderDetails" nillable="true" type="impl:ArrayOfOrderDetail"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
<element maxOccurs="1" minOccurs="0" name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetCertificateOrders">
<complexType>
<sequence>
<element name="Request" type="impl:GetCertificateOrdersRequest"/>
</sequence>
</complexType>
</element>
<complexType name="GetCertificateOrdersRequest">
<sequence>
<element maxOccurs="1" minOccurs="0" name="FQDN" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FromDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderKind" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
<element maxOccurs="1" minOccurs="0" name="SubID" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetCertificateOrdersResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetCertificateOrdersResponse"/>
</sequence>
</complexType>
</element>
<complexType name="SearchOrderDetail">
<sequence>
<element maxOccurs="1" minOccurs="0" name="BaseOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FQDN" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Licenses" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Months" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderCanceledDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderIssueDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderKind" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderRequestDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Orderid" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="RequestKind" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SubId" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfSearchOrderDetail">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="SearchOrderDetail" type="impl:SearchOrderDetail"/>
</sequence>
</complexType>
<complexType name="GetCertificateOrdersResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="FromDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
<element maxOccurs="1" minOccurs="0" name="SearchOrderDetails" nillable="true" type="impl:ArrayOfSearchOrderDetail"/>
<element maxOccurs="1" minOccurs="0" name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetOrderByDataRange">
<complexType>
<sequence>
<element name="Request" type="impl:GetOrderByDataRangeRequest"/>
</sequence>
</complexType>
</element>
<complexType name="GetOrderByDataRangeRequest">
<sequence>
<element name="FromDate" nillable="true" type="xsd:dateTime"/>
<element name="OrderQueryOption" nillable="true" type="impl:OrderQueryOption"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
<element name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetOrderByDataRangeResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetOrderByDataRangeResponse"/>
</sequence>
</complexType>
</element>
<complexType name="GetOrderByDataRangeResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="FromDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderDetails" nillable="true" type="impl:ArrayOfOrderDetail"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
<element maxOccurs="1" minOccurs="0" name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="GetDVApproverListResponse">
<wsdl:part element="impl:GetDVApproverListResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetOrderByOrderIDResponse">
<wsdl:part element="impl:GetOrderByOrderIDResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetModifiedOrdersRequest">
<wsdl:part element="impl:GetModifiedOrders" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetOrderByDataRangeResponse">
<wsdl:part element="impl:GetOrderByDataRangeResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetApproverListResponse">
<wsdl:part element="impl:GetApproverListResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetDVApproverListRequest">
<wsdl:part element="impl:GetDVApproverList" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetApproverListRequest">
<wsdl:part element="impl:GetApproverList" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetCertificateOrdersRequest">
<wsdl:part element="impl:GetCertificateOrders" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetOrderByDataRangeRequest">
<wsdl:part element="impl:GetOrderByDataRange" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetCertificateOrdersResponse">
<wsdl:part element="impl:GetCertificateOrdersResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetModifiedOrdersResponse">
<wsdl:part element="impl:GetModifiedOrdersResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetOrderByOrderIDRequest">
<wsdl:part element="impl:GetOrderByOrderID" name="parameters"/>
</wsdl:message>
<wsdl:portType name="GasQuery">
<wsdl:operation name="GetDVApproverList">
<wsdl:input message="impl:GetDVApproverListRequest" name="GetDVApproverListRequest"/>
<wsdl:output message="impl:GetDVApproverListResponse" name="GetDVApproverListResponse"/>
</wsdl:operation>
<wsdl:operation name="GetApproverList">
<wsdl:input message="impl:GetApproverListRequest" name="GetApproverListRequest"/>
<wsdl:output message="impl:GetApproverListResponse" name="GetApproverListResponse"/>
</wsdl:operation>
<wsdl:operation name="GetOrderByOrderID">
<wsdl:input message="impl:GetOrderByOrderIDRequest" name="GetOrderByOrderIDRequest"/>
<wsdl:output message="impl:GetOrderByOrderIDResponse" name="GetOrderByOrderIDResponse"/>
</wsdl:operation>
<wsdl:operation name="GetModifiedOrders">
<wsdl:input message="impl:GetModifiedOrdersRequest" name="GetModifiedOrdersRequest"/>
<wsdl:output message="impl:GetModifiedOrdersResponse" name="GetModifiedOrdersResponse"/>
</wsdl:operation>
<wsdl:operation name="GetCertificateOrders">
<wsdl:input message="impl:GetCertificateOrdersRequest" name="GetCertificateOrdersRequest"/>
<wsdl:output message="impl:GetCertificateOrdersResponse" name="GetCertificateOrdersResponse"/>
</wsdl:operation>
<wsdl:operation name="GetOrderByDataRange">
<wsdl:input message="impl:GetOrderByDataRangeRequest" name="GetOrderByDataRangeRequest"/>
<wsdl:output message="impl:GetOrderByDataRangeResponse" name="GetOrderByDataRangeResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="GasQuerySoapBinding" type="impl:GasQuery">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="GetDVApproverList">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetDVApproverListRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetDVApproverListResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetApproverList">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetApproverListRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetApproverListResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetOrderByOrderID">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetOrderByOrderIDRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetOrderByOrderIDResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetModifiedOrders">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetModifiedOrdersRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetModifiedOrdersResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetCertificateOrders">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetCertificateOrdersRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetCertificateOrdersResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetOrderByDataRange">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetOrderByDataRangeRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetOrderByDataRangeResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="GasQueryService">
<wsdl:port binding="impl:GasQuerySoapBinding" name="GasQuery">
<wsdlsoap:address location="http://localhost:8080/services/GasQuery"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

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