From 84b53d92614f54c8dbfa44e0445f843c7f5b1526 Mon Sep 17 00:00:00 2001 From: Martin Kutter Date: Sat, 17 Nov 2007 14:07:49 -0800 Subject: [PATCH] import SOAP-WSDL 2.00_24 from CPAN git-cpan-module: SOAP-WSDL git-cpan-version: 2.00_24 git-cpan-authorid: MKUTTER git-cpan-file: authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_24.tar.gz --- Build.PL | 3 +- CHANGES => Changes | 27 +- HACKING | 134 +++- MANIFEST | 20 +- META.yml | 28 +- TODO | 8 +- benchmark/smallprof.out | 5 - benchmark/smallprof.out-whitespace | 315 --------- example/fortune.pl | 8 +- example/lib/MyElements/CountCookies.pm | 67 +- .../lib/MyElements/CountCookiesResponse.pm | 104 ++- example/lib/MyElements/GenerateBarCode.pm | 102 +++ .../lib/MyElements/GenerateBarCodeResponse.pm | 79 +++ example/lib/MyElements/GetCitiesByCountry.pm | 110 ++- .../MyElements/GetCitiesByCountryResponse.pm | 110 ++- example/lib/MyElements/GetFortuneCookie.pm | 67 +- .../MyElements/GetFortuneCookieResponse.pm | 104 ++- example/lib/MyElements/GetSpecificCookie.pm | 104 ++- .../MyElements/GetSpecificCookieResponse.pm | 104 ++- example/lib/MyElements/GetWeather.pm | 127 ++-- example/lib/MyElements/GetWeatherResponse.pm | 110 ++- example/lib/MyElements/int.pm | 52 +- example/lib/MyElements/readNodeCount.pm | 67 +- .../lib/MyElements/readNodeCountResponse.pm | 104 ++- example/lib/MyElements/string.pm | 58 +- .../FullerData_x0020_Fortune_x0020_Cookie.pm | 327 --------- ...llerData_x0020_Fortune_x0020_CookieSoap.pm | 191 +++++ example/lib/MyInterfaces/GlobalWeather.pm | 83 --- .../GlobalWeather/GlobalWeatherSoap.pm | 136 ++++ .../FullerData_x0020_Fortune_x0020_Cookie.pm | 71 +- example/lib/MyTypemaps/GlobalWeather.pm | 68 +- example/weather.pl | 10 +- example/wsdl/genericbarcode.xml | 153 ---- lib/SOAP/WSDL.pm | 242 ++++--- lib/SOAP/WSDL/Base.pm | 35 +- lib/SOAP/WSDL/Client.pm | 104 +-- lib/SOAP/WSDL/Client/Base.pm | 99 +-- lib/SOAP/WSDL/Definitions.pm | 42 +- lib/SOAP/WSDL/Deserializer/Hash.pm | 46 +- lib/SOAP/WSDL/Deserializer/SOM.pm | 50 +- lib/SOAP/WSDL/Deserializer/XSD.pm | 67 +- lib/SOAP/WSDL/Expat/Base.pm | 12 +- lib/SOAP/WSDL/Expat/Message2Hash.pm | 44 +- lib/SOAP/WSDL/Expat/MessageParser.pm | 115 ++- lib/SOAP/WSDL/Expat/MessageStreamParser.pm | 31 +- lib/SOAP/WSDL/Expat/WSDLParser.pm | 56 +- lib/SOAP/WSDL/Factory/Deserializer.pm | 34 +- lib/SOAP/WSDL/Factory/Generator.pm | 36 +- lib/SOAP/WSDL/Factory/Serializer.pm | 36 +- lib/SOAP/WSDL/Factory/Transport.pm | 62 +- lib/SOAP/WSDL/Generator/Template.pm | 9 +- lib/SOAP/WSDL/Generator/Template/XSD.pm | 53 +- .../WSDL/Generator/Template/XSD/Interface.tt | 21 +- .../Generator/Template/XSD/Interface/Body.tt | 91 ++- .../Template/XSD/Interface/Header.tt | 34 +- .../Template/XSD/Interface/Operation.tt | 5 +- .../Template/XSD/Interface/POD/Element.tt | 10 +- .../Template/XSD/Interface/POD/Message.tt | 4 +- .../Template/XSD/Interface/POD/Part.tt | 12 +- .../Template/XSD/Interface/POD/Type.tt | 4 +- .../Template/XSD/Interface/POD/method_info.tt | 6 +- .../WSDL/Generator/Template/XSD/Typemap.tt | 2 +- .../Generator/Template/XSD/_type_class.tt | 10 +- .../Generator/Template/XSD/complexType.tt | 6 +- .../XSD/complexType/POD/complexContent.tt | 6 +- .../Template/XSD/complexType/POD/structure.tt | 14 +- .../Generator/Template/XSD/complexType/all.tt | 40 +- .../Template/XSD/complexType/atomicTypes.tt | 18 +- .../XSD/complexType/complexContent.tt | 6 +- .../Template/XSD/complexType/contentModel.tt | 6 +- .../Template/XSD/complexType/extension.tt | 8 +- .../Template/XSD/complexType/restriction.tt | 8 +- .../Template/XSD/complexType/variety.tt | 12 +- .../WSDL/Generator/Template/XSD/element.tt | 16 +- .../Template/XSD/element/POD/structure.tt | 46 +- .../WSDL/Generator/Template/XSD/simpleType.tt | 16 +- .../Template/XSD/simpleType/POD/list.tt | 20 +- .../XSD/simpleType/POD/restriction.tt | 19 +- .../Template/XSD/simpleType/contentModel.tt | 10 +- .../Generator/Template/XSD/simpleType/list.tt | 20 +- .../Template/XSD/simpleType/restriction.tt | 6 +- lib/SOAP/WSDL/Generator/Visitor.pm | 134 ++-- lib/SOAP/WSDL/Generator/Visitor/Typemap.pm | 58 +- lib/SOAP/WSDL/Manual.pod | 197 +++--- lib/SOAP/WSDL/Manual/Deserializer.pod | 49 ++ lib/SOAP/WSDL/Manual/Glossary.pod | 62 +- lib/SOAP/WSDL/Manual/Parser.pod | 223 +++--- lib/SOAP/WSDL/Manual/Serializer.pod | 30 + lib/SOAP/WSDL/Manual/WS_I.pod | 657 +++++++++--------- lib/SOAP/WSDL/Manual/XSD.pod | 202 ++++-- lib/SOAP/WSDL/Operation.pm | 2 +- lib/SOAP/WSDL/Part.pm | 6 +- lib/SOAP/WSDL/PortType.pm | 2 +- lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm | 20 +- lib/SOAP/WSDL/Serializer/XSD.pm | 69 +- lib/SOAP/WSDL/Transport/HTTP.pm | 26 +- lib/SOAP/WSDL/Transport/Loopback.pm | 28 +- lib/SOAP/WSDL/Transport/Test.pm | 38 +- lib/SOAP/WSDL/TypeLookup.pm | 19 +- lib/SOAP/WSDL/XSD/Builtin.pm | 4 +- lib/SOAP/WSDL/XSD/ComplexType.pm | 33 +- lib/SOAP/WSDL/XSD/Element.pm | 9 +- lib/SOAP/WSDL/XSD/Schema/Builtin.pm | 115 +-- lib/SOAP/WSDL/XSD/SimpleType.pm | 10 +- lib/SOAP/WSDL/XSD/Typelib/Builtin.pm | 84 ++- lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm | 4 +- .../WSDL/XSD/Typelib/Builtin/anySimpleType.pm | 6 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm | 8 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm | 4 +- .../WSDL/XSD/Typelib/Builtin/base64Binary.pm | 8 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm | 26 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm | 16 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm | 4 +- .../WSDL/XSD/Typelib/Builtin/gMonthDay.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm | 4 +- .../WSDL/XSD/Typelib/Builtin/gYearMonth.pm | 4 +- .../WSDL/XSD/Typelib/Builtin/hexBinary.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm | 10 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm | 4 +- .../XSD/Typelib/Builtin/negativeInteger.pm | 4 +- .../XSD/Typelib/Builtin/nonNegativeInteger.pm | 4 +- .../XSD/Typelib/Builtin/nonPositiveInteger.pm | 4 +- .../XSD/Typelib/Builtin/normalizedString.pm | 4 +- .../XSD/Typelib/Builtin/positiveInteger.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm | 4 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm | 6 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm | 16 +- lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm | 6 +- .../WSDL/XSD/Typelib/Builtin/unsignedByte.pm | 4 +- .../WSDL/XSD/Typelib/Builtin/unsignedInt.pm | 4 +- .../WSDL/XSD/Typelib/Builtin/unsignedLong.pm | 4 +- .../WSDL/XSD/Typelib/Builtin/unsignedShort.pm | 6 +- lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm | 166 ++--- lib/SOAP/WSDL/XSD/Typelib/Element.pm | 30 +- t/002_parse_wsdl.t | 17 +- t/097_kwalitee.t | 21 + t/099_pod_coverage.t | 58 ++ t/Expat/01_expat.t | 4 + t/SOAP/WSDL/03_complexType-element-ref.t | 2 +- t/SOAP/WSDL/04_element.t | 4 +- t/SOAP/WSDL/Deserializer/Hash.t | 24 +- t/SOAP/WSDL/Deserializer/SOM.t | 2 +- t/SOAP/WSDL/Deserializer/XSD.t | 8 +- t/SOAP/WSDL/Generator/XSD.t | 17 +- t/SOAP/WSDL/Transport/01_Test.t | 1 + t/SOAP/WSDL/XSD/Typelib/Builtin/boolean.t | 3 +- t/SOAP/WSDL/XSD/Typelib/Builtin/date.t | 6 + t/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.t | 4 + t/SOAP/WSDL/XSD/Typelib/Builtin/language.t | 12 + t/SOAP/WSDL/XSD/Typelib/Builtin/time.t | 3 + t/SOAP/WSDL/XSD/Typelib/ComplexType.t | 216 ++++++ t/SOAP/WSDL/XSD/Typelib/Element.t | 44 ++ t/acceptance/wsdl/generator_test.wsdl | 7 + 169 files changed, 3995 insertions(+), 3676 deletions(-) rename CHANGES => Changes (94%) delete mode 100644 benchmark/smallprof.out delete mode 100644 benchmark/smallprof.out-whitespace create mode 100644 example/lib/MyElements/GenerateBarCode.pm create mode 100644 example/lib/MyElements/GenerateBarCodeResponse.pm delete mode 100644 example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm create mode 100644 example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm delete mode 100644 example/lib/MyInterfaces/GlobalWeather.pm create mode 100644 example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm delete mode 100644 example/wsdl/genericbarcode.xml create mode 100644 lib/SOAP/WSDL/Manual/Deserializer.pod create mode 100644 lib/SOAP/WSDL/Manual/Serializer.pod create mode 100644 t/097_kwalitee.t create mode 100644 t/099_pod_coverage.t create mode 100644 t/SOAP/WSDL/XSD/Typelib/Builtin/language.t create mode 100644 t/SOAP/WSDL/XSD/Typelib/ComplexType.t create mode 100644 t/SOAP/WSDL/XSD/Typelib/Element.t diff --git a/Build.PL b/Build.PL index e130738..1dd37f5 100644 --- a/Build.PL +++ b/Build.PL @@ -1,10 +1,11 @@ use Module::Build; $build = Module::Build->new( + dist_author => 'Martin Kutter ', create_makefile_pl => 'passthrough', dist_abstract => 'SOAP with WSDL support', dist_name => 'SOAP-WSDL', - dist_version => '2.00_23', + dist_version => '2.00_24', module_name => 'SOAP::WSDL', license => 'artistic', requires => { diff --git a/CHANGES b/Changes similarity index 94% rename from CHANGES rename to Changes index d801cb2..d5f55e3 100644 --- a/CHANGES +++ b/Changes @@ -1,4 +1,4 @@ -Release notes for SOAP::WSDL 2.00_23 +Release notes for SOAP::WSDL 2.00_24 ------- I'm proud to present a new pre-release version of SOAP::WSDL. @@ -20,7 +20,8 @@ Features: the module's internals * Thorough test suite o SOAP::WSDL is heavily regression tested, with a test coverage of - over 95%. + over 95% (excluding documentation - you wouldn't want to read + through it all). * SOAP::Lite like look and feel o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations * XML schema based class library for creating data objects @@ -33,6 +34,28 @@ Features: The following changes have been made: +2.00_24 +--- +The following features were added (the numbers in square brackets are the +tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): + + * [ 1832998 ] Make interface methods complain when called as class method + * [ 1826833 ] listify all XSD type objects when called as @{} + +The following bugs have been fixed (the numbers in square brackets are the +tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): +The numbers with # are CPAN RT IDs (http://rt.cpan.org/). + + * #30685: Error in MessageParser when using __SKIP__ in typemap + * [ 1831398 ] Badd class names for atomic typed elements + * [ 1828240 ] POD Defects + * [ 1792348 ] 006_client.t requires SOAP::Lite (again) + +The following uncategorized improvements have been made: + + * The test suite has been improved + * Documentation has been improved + 2.00_23 --- diff --git a/HACKING b/HACKING index cc27f04..6029227 100644 --- a/HACKING +++ b/HACKING @@ -1,3 +1,6 @@ +HACKING +======= + Development of SOAP::WSDL takes place on sourceforge.net. There's a svn repository available at @@ -11,35 +14,118 @@ so if you feel your changes are urgent, please set up a sourceforge account and ask me for commit permissions on the repository - I will happily accept you as co-author. -The (my) current roadmap for SOAP::WSDL is: +TODO shows the current roadmap. -1.* Development of the 1.* tree has stopped - I won't get past 1.2x anymore... -2.* WSDL -> Perl Class factory with offline WSDL processing +SOAP-WSDL CODING GUIDELINES +=========================== -2.01 -- WSDL support for the most common type definitions -- Online-facility (SOAP::WSDL) using WSDL object tree directly -- usable code generator -- full namespace support when processing WSDL -- high performance when parsing WSDL messages - get nearly as fast as - XML::Simple... +DESIGN PRINCIPLES +----------------- -2.02 -- Support for Apache-SOAP datatypes -- support for embedded atomic simpleType/complexType definitions -- Caching of WSDL object tree + generated code (when using SOAP::WSDL). -- Online-facility (SOAP::WSDL) using code generator via cache directory +SOAP-WSDL is designed for the following principles: -Somewhere on the TODO list (in no particular order): +1. SPEED +A SOAP toolkit is useless, if it's not fast enough. Therefore SOAP::WSDL aims +at always being fast enough. -- validation -- typemaps for use with the type="tns:MyComplexType" XML attribute -- external entities support when parsing WSDL -- support all these XML Schema variants -- support creating XML Schmema definitions via SOAP::WSDL::XSD::* ('minimal conformant') -- support other Schema definition languages than XML::Schema (maybe RelaxNG?) -- factor out SOAP::WSDL::XSD into it's own namespace (maybe just XSD ?) +Please benchmark any contributions - if they slow down SOAP-WSDL (especially +the XML parsing part), you should have good reasons. -July 2007, +2. USABILITY +SOAP-WSDL is designed user-friendly. It tells the user whether it's +capable of handling some WSDL or not, it gives friendly error messages, and +if a user happens to call a non-existant method on XSD objects, they croak +with a list of available methods to ease development. + +3. EXTENSIBILITY +If you plan an extension, look if the extension itself should be extensible, +and which extension points to use. + +Creating new extension points is highly appreciated. + +4. MAINTAINABILITY +SOAP::Lite unfortunately shows where a toolkit can go without focus on +maintainability. SOAP::WSDL tries to be highly maintainable and easy to +understand. + +CODING STYLE +------------ + +The principles above dictate a clear, but not too lengthy coding style. + +SOAP::WSDL's coding style in principle follows Perl Best Practices by +Damian Conway, but allows deviances for speed reasons + +The following guidelines apply: + +- Testing + * SOAP::WSDL has a test coverage of >95% and aims at 100%. Please write + a test first. + * Use uthor tests are for testing guidelines. Disable author tests for + users - it's time consuming and of no use to have users run author tests. + +- Indentation and formatting + * indent with spaces. + * indent 4 characters per level + * use \n (LF) for newlines, not CRLF + * use blank lines to separate paragraphs + * Coding style is similar to K&R (opening brace on last line, closing + brace on new line. No cuddled else) + * No trailing spaces allowed (except to indicate a blank line in a POD + source block) + +- Flow control + * postfix if is allowed for single statements only. Preferably for flow + control only. + * postfix for, while, until are not allowed. + * unless is not allowed at all. Use if not. + * goto is only allowed for jumping into subs. Nothing else. + * redo, next, last etc. are preferred over goto. + +- Strictness and Warnings + * always use strict and warnings. Switch off for the smallest block + possible, but switch of if there's a reason (don't let tools like + perlcritic fool you: no strict qw(refs); is often required. + +- Naming + * variable names are lower case with _ separating words, except when + a XML Schema, SOAP, or WSDL name is name-giving (don't force portType to + become port_type) + * hashes should be named FOO_of, lists FOO_from, references FOO_ref. + * package names are CamelCase, except when a XML, SOAP or WSDL name is + name-giving (don't force 'int' to become 'Int'. However, simpleType + becomes SimpleType). + +- Subroutines + * Subroutines shouldn't be more than around 50 lines long + * @_ should be unpacked. Deviances are allowed for speed reasons. If + you're not unpacking @_ in a sub of say, 5 lines or more, please comment + what you're doing. + * Always return. Always return. A single "return" allows perl to execute + the subroutine in question in void context, which saves it from putting + it's result in a temporary variable. Always return. + +- POD and comments + * Comment extensively. Comments are the maintainer (and core developer's) + documentation - aid them where possible (your're probably doing yourself + a favor by adding extensive comments). + * Comment either in blocks or as hanging side comments (especially when + commenting @_ access). + Example: + + sub baz { + # @_ not unpacked for speed reasons. Read: + # my ($self, $something, %args_of) = @_; + + $_[0]->bar($_[1]); # read as $self->bar($something); + $_[0]->foo($_[2..$#]); # read as $self->foo(%args_of); + return; + } + * POD is located at end of file, preferably after + * Complete POD coverage is essential. However, if the package in question + is used internally only, it's better to omit the POD completely - too many + PODs to look at confuse the average CPAN user. + +July - November 2007, Martin Kutter \ No newline at end of file diff --git a/MANIFEST b/MANIFEST index 058b673..60235d9 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,15 +1,15 @@ benchmark/01_expat.t -benchmark/smallprof.out -benchmark/smallprof.out-whitespace benchmark/XSD/01_anyType.t benchmark/XSD/02_anySimpleType.t benchmark/XSD/03_string.t bin/wsdl2perl.pl Build.PL -CHANGES +Changes example/fortune.pl example/lib/MyElements/CountCookies.pm example/lib/MyElements/CountCookiesResponse.pm +example/lib/MyElements/GenerateBarCode.pm +example/lib/MyElements/GenerateBarCodeResponse.pm example/lib/MyElements/GetCitiesByCountry.pm example/lib/MyElements/GetCitiesByCountryResponse.pm example/lib/MyElements/GetFortuneCookie.pm @@ -22,15 +22,14 @@ example/lib/MyElements/int.pm example/lib/MyElements/readNodeCount.pm example/lib/MyElements/readNodeCountResponse.pm example/lib/MyElements/string.pm -example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm -example/lib/MyInterfaces/GlobalWeather.pm +example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm +example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm example/lib/MyTypemaps/GlobalWeather.pm example/visitor/visitor.pl example/weather.pl example/weather_wsdl.pl example/wsdl/FortuneCookie.xml -example/wsdl/genericbarcode.xml example/wsdl/globalweather.xml HACKING lib/SOAP/WSDL.pm @@ -40,8 +39,8 @@ lib/SOAP/WSDL/Client.pm lib/SOAP/WSDL/Client/Base.pm lib/SOAP/WSDL/Definitions.pm lib/SOAP/WSDL/Deserializer/Hash.pm -lib/SOAP/WSDL/Deserializer/XSD.pm lib/SOAP/WSDL/Deserializer/SOM.pm +lib/SOAP/WSDL/Deserializer/XSD.pm lib/SOAP/WSDL/Expat/Base.pm lib/SOAP/WSDL/Expat/Message2Hash.pm lib/SOAP/WSDL/Expat/MessageParser.pm @@ -92,8 +91,10 @@ lib/SOAP/WSDL/Generator/Visitor.pm lib/SOAP/WSDL/Generator/Visitor/Typelib.pm lib/SOAP/WSDL/Generator/Visitor/Typemap.pm lib/SOAP/WSDL/Manual.pod +lib/SOAP/WSDL/Manual/Deserializer.pod lib/SOAP/WSDL/Manual/Glossary.pod lib/SOAP/WSDL/Manual/Parser.pod +lib/SOAP/WSDL/Manual/Serializer.pod lib/SOAP/WSDL/Manual/WS_I.pod lib/SOAP/WSDL/Manual/XSD.pod lib/SOAP/WSDL/Message.pm @@ -193,7 +194,9 @@ t/016_client_object.t t/017_generator.t t/018_compat_2_00_15-generator.t t/020_storable.t +t/097_kwalitee.t t/098_pod.t +t/099_pod_coverage.t t/acceptance/results/03_complexType-all.xml t/acceptance/results/03_complexType-sequence.xml t/acceptance/results/04_element-simpleType.xml @@ -292,6 +295,7 @@ t/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.t t/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.t t/SOAP/WSDL/XSD/Typelib/Builtin/int.t t/SOAP/WSDL/XSD/Typelib/Builtin/integer.t +t/SOAP/WSDL/XSD/Typelib/Builtin/language.t t/SOAP/WSDL/XSD/Typelib/Builtin/long.t t/SOAP/WSDL/XSD/Typelib/Builtin/Name.t t/SOAP/WSDL/XSD/Typelib/Builtin/NCName.t @@ -311,6 +315,8 @@ t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.t t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.t t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.t t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.t +t/SOAP/WSDL/XSD/Typelib/ComplexType.t +t/SOAP/WSDL/XSD/Typelib/Element.t t/test.wsdl TEST_COVERAGE TODO diff --git a/META.yml b/META.yml index 5a35a9d..0cd00ce 100644 --- a/META.yml +++ b/META.yml @@ -1,7 +1,8 @@ --- name: SOAP-WSDL -version: 2.00_23 -author: [] +version: 2.00_24 +author: + - 'Martin Kutter ' abstract: SOAP with WSDL support license: artistic resources: @@ -35,35 +36,40 @@ provides: version: 2.00_17 SOAP::WSDL::Client::Base: file: lib/SOAP/WSDL/Client/Base.pm - version: 2.00_17 + version: 2.00_24 SOAP::WSDL::Definitions: file: lib/SOAP/WSDL/Definitions.pm version: 2.00_17 SOAP::WSDL::Deserializer::Hash: file: lib/SOAP/WSDL/Deserializer/Hash.pm - version: 2.00_17 + version: 2.00_24 SOAP::WSDL::Deserializer::SOM: file: lib/SOAP/WSDL/Deserializer/SOM.pm - version: 2.00_15 + version: 2.00_24 SOAP::WSDL::Deserializer::XSD: file: lib/SOAP/WSDL/Deserializer/XSD.pm - version: 2.00_21 + version: 2.00_24 SOAP::WSDL::Expat::Base: file: lib/SOAP/WSDL/Expat/Base.pm + version: 2.00_24 SOAP::WSDL::Expat::Message2Hash: file: lib/SOAP/WSDL/Expat/Message2Hash.pm + version: 2.00_24 SOAP::WSDL::Expat::MessageParser: file: lib/SOAP/WSDL/Expat/MessageParser.pm + version: 2.00_24 SOAP::WSDL::Expat::MessageStreamParser: file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm + version: 2.00_24 SOAP::WSDL::Factory::Deserializer: file: lib/SOAP/WSDL/Factory/Deserializer.pm + version: 2.00_24 SOAP::WSDL::Factory::Generator: file: lib/SOAP/WSDL/Factory/Generator.pm - version: 2.00_18 + version: 2.00_24 SOAP::WSDL::Factory::Serializer: file: lib/SOAP/WSDL/Factory/Serializer.pm - version: 2.00_17 + version: 2.00_24 SOAP::WSDL::Factory::Transport: file: lib/SOAP/WSDL/Factory/Transport.pm version: 2.00_17 @@ -107,7 +113,7 @@ provides: version: 2.00_17 SOAP::WSDL::Serializer::XSD: file: lib/SOAP/WSDL/Serializer/XSD.pm - version: 2.00_21 + version: 2.00_24 SOAP::WSDL::Service: file: lib/SOAP/WSDL/Service.pm SOAP::WSDL::Transport::HTTP: @@ -236,10 +242,10 @@ provides: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm SOAP::WSDL::XSD::Typelib::ComplexType: file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm - version: 2.00_23 + version: 2.00_24 SOAP::WSDL::XSD::Typelib::Element: file: lib/SOAP/WSDL/XSD/Typelib/Element.pm - version: 2.00_23 + version: 2.00_24 SOAP::WSDL::XSD::Typelib::SimpleType: file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm SOAP::WSDL::XSD::Typelib::SimpleType::restriction: diff --git a/TODO b/TODO index 05ae23f..a3f0426 100644 --- a/TODO +++ b/TODO @@ -3,15 +3,13 @@ TODO list for SOAP::WSDL 2.00 Pre-releases -------- -* Implement a interface similar to SOAP::Schema (#1783639) - 2.1 release -------- -* Support namespaces in SOAP message payload +* Support namespaces in SOAP message payload(#1809057) -* Support the xsi:type attribute on derived types on the wire +* Support the xsi:type attribute on derived types on the wire(#1809059) -* SOAP1.2 support +* SOAP1.2 support (#1803331) 2.2 release -------- diff --git a/benchmark/smallprof.out b/benchmark/smallprof.out deleted file mode 100644 index cc79781..0000000 --- a/benchmark/smallprof.out +++ /dev/null @@ -1,5 +0,0 @@ - ================ SmallProf version 2.02 ================ - Profile of -e Page 1 - ================================================================= - count wall tm cpu time line - 1 0.00004 0.00000 1:print 1 diff --git a/benchmark/smallprof.out-whitespace b/benchmark/smallprof.out-whitespace deleted file mode 100644 index da5f1eb..0000000 --- a/benchmark/smallprof.out-whitespace +++ /dev/null @@ -1,315 +0,0 @@ - ================ SmallProf version 2.02 ================ - Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 1 - ================================================================= - count wall tm cpu time line - 0 0.00000 0.00000 1:#!/usr/bin/perl - 0 0.00000 0.00000 2:package SOAP::WSDL::Expat::MessageParser; - 0 0.00000 0.00000 3:use strict; - 0 0.00000 0.00000 4:use warnings; - 0 0.00000 0.00000 5:use SOAP::WSDL::XSD::Typelib::Builtin; - 0 0.00000 0.00000 6:use XML::Parser::Expat; - 0 0.00000 0.00000 7: - 0 0.00000 0.00000 8:sub new { - 1 0.00000 0.00000 9: my ($class, $args) = @_; - 0 0.00000 0.00000 10: my $self = { - 0 0.00000 0.00000 11: class_resolver => $args->{ - 1 0.00001 0.00000 12: strict => exists $args->{ strict } ? - 0 0.00000 0.00000 13: }; - 1 0.00001 0.00000 14: bless $self, $class; - 1 0.02309 0.03000 15: return $self; - 0 0.00000 0.00000 16:} - 0 0.00000 0.00000 17: - 0 0.00000 0.00000 18:sub class_resolver { - 1 0.00000 0.00000 19: my $self = shift; - 1 2.74336 2.69000 20: $self->{ class_resolver } = shift; - 0 0.00000 0.00000 21:} - 0 0.00000 0.00000 22: - 0 0.00000 0.00000 23:sub _initialize { - 1000 0.00163 0.01000 24: my ($self, $parser) = @_; - 1000 0.03682 0.05000 25: $self->{ parser } = $parser; - 0 0.00000 0.00000 26: - 1000 0.00138 0.01000 27: delete $self->{ data }; - 0 0.00000 0.00000 28: - 1000 0.00048 0.01000 29: my $characters; - 1000 0.00091 0.00000 30: my $current = undef; - 1000 0.00097 0.01000 31: my $list = []; # - 1000 0.00107 0.01000 32: my $path = []; # - 1000 0.00054 0.01000 33: my $skip = 0; # - 1000 0.00053 0.01000 34: my $current_part = q{}; # are - 0 0.00000 0.00000 35: - 1000 0.00041 0.02000 36: my $depth = 0; - 0 0.00000 0.00000 37: - 0 0.00000 0.00000 38: my %content_check = $self->{strict} - 0 0.00000 0.00000 39: ? ( - 0 0.00000 0.00000 40: 0 => sub { - 1000 0.00097 0.02000 41: die "Bad top node $_[1]" - 1000 0.01651 0.00000 42: die "Bad namespace for - 0 0.00000 0.00000 43: if $_[0]- - 1000 0.00068 0.00000 44: $depth++; - 1000 0.00441 0.02000 45: return; - 0 0.00000 0.00000 46: }, - 0 0.00000 0.00000 47: 1 => sub { - 1000 0.00369 0.02000 48: die "Bad node $_[1]. - 1000 0.00060 0.00000 49: $depth++; - 1000 0.03693 0.03000 50: return; - 0 0.00000 0.00000 51: } - 0 0.00000 0.00000 52: ) - 1000 0.01252 0.01000 53: : (); - 0 0.00000 0.00000 54: - 0 0.00000 0.00000 55: # use "globals" for speed - 1000 0.00095 0.01000 56: my ($_prefix, $_method, - ================ SmallProf version 2.02 ================ - Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 2 - ================================================================= - count wall tm cpu time line - 0 0.00000 0.00000 57: $_class) = (); - 0 0.00000 0.00000 58: - 0 0.00000 0.00000 59: no strict qw(refs); - 0 0.00000 0.00000 60: $parser->setHandlers( - 0 0.00000 0.00000 61: Start => sub { - 0 0.00000 0.00000 62: # my ($parser, $element, %_attrs) - 0 0.00000 0.00000 63: # $depth = $parser->depth(); - 0 0.00000 0.00000 64: - 0 0.00000 0.00000 65: # call methods without using - 0 0.00000 0.00000 66: # That's slightly faster than - 0 0.00000 0.00000 67: # and we don't have to pass $_[1] - 0 0.00000 0.00000 68: # Yup, that's dirty. - 28000 0.03090 0.31000 69: return &{$content_check{ $depth - 0 0.00000 0.00000 70: - 26000 0.03309 0.32000 71: push @{ $path }, $_[1]; # - 26000 0.01337 0.21000 72: return if $skip; # - 0 0.00000 0.00000 73: - 0 0.00000 0.00000 74: # resolve class of this element - 0 0.00000 0.00000 75: $_class = $self->{ class_resolver - 0 0.00000 0.00000 76: or die "Cannot resolve class - 26000 0.28467 0.53000 77: . join('/', @{ $path }) . - 0 0.00000 0.00000 78: - 0 0.00000 0.00000 79: # maybe write as "return $skip = - 0 0.00000 0.00000 80: # would save a BLOCK... - 26000 0.03919 0.30000 81: return $skip = join('/', @{ $path - 0 0.00000 0.00000 82: - 26000 0.05079 0.22000 83: push @$list, $current; # step - 0 0.00000 0.00000 84: - 26000 0.07934 0.26000 85: $characters = q(); # empty - 0 0.00000 0.00000 86: - 0 0.00000 0.00000 87: # Check whether we have a builtin - 0 0.00000 0.00000 88: # We could replace this with - 0 0.00000 0.00000 89: # match is a bit faster if the - 0 0.00000 0.00000 90: # if $class matches... - 26000 0.01981 0.22000 91: if (index $_class, - 0 0.00000 0.00000 92: # check wheter there is a - 0 0.00000 0.00000 93: # or a "new" method - 0 0.00000 0.00000 94: # If not, require it - all - 0 0.00000 0.00000 95: # define new() - 0 0.00000 0.00000 96: # This is not exactly the - 0 0.00000 0.00000 97: defined *{ "$_class\::new" }{ - 26000 0.08308 0.26000 98: or scalar @{ *{ - 0 0.00000 0.00000 99: or eval "require $_class" - 0 0.00000 0.00000 100: or die $@; - 0 0.00000 0.00000 101: } - 0 0.00000 0.00000 102: - 26000 0.45611 0.64000 103: $current = $_class->new({ - 0 0.00000 0.00000 104: - 0 0.00000 0.00000 105: # remember top level element - 0 0.00000 0.00000 106: exists $self->{ data } - 26000 0.02518 0.26000 107: or ($self->{ data } = - 26000 0.01496 0.32000 108: $depth++; - 26000 0.07949 0.39000 109: return; - 0 0.00000 0.00000 110: }, - 0 0.00000 0.00000 111: - 0 0.00000 0.00000 112: Char => sub { - ================ SmallProf version 2.02 ================ - Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 3 - ================================================================= - count wall tm cpu time line - 80000 0.05801 0.73000 113: return if $skip; - 80000 0.38097 1.05000 114: return if $_[1] =~m{ \A \s* \z - 25000 0.01804 0.24000 115: $characters .= $_[1]; - 25000 0.07404 0.32000 116: return; - 0 0.00000 0.00000 117: }, - 0 0.00000 0.00000 118: - 0 0.00000 0.00000 119: End => sub { - 0 0.00000 0.00000 120: - 28000 0.02209 0.25000 121: pop @{ $path }; - 0 0.00000 0.00000 122: - 28000 0.01658 0.29000 123: if ($skip) { - 0 0.00000 0.00000 124: return if $skip ne join '/', - 0 0.00000 0.00000 125: $skip = 0; - 0 0.00000 0.00000 126: return; - 0 0.00000 0.00000 127: } - 0 0.00000 0.00000 128: - 28000 0.01628 0.26000 129: $depth--; - 0 0.00000 0.00000 130: - 0 0.00000 0.00000 131: # This one easily handles ignores - 28000 0.11185 0.27000 132: return if not ref $list->[-1]; - 0 0.00000 0.00000 133: - 0 0.00000 0.00000 134: # set characters in current if we - 0 0.00000 0.00000 135: # we may have characters in - 0 0.00000 0.00000 136: # too - maybe we should rely on - 0 0.00000 0.00000 137: # may get a speedup by defining a - 0 0.00000 0.00000 138: # and looking it up via exists - 0 0.00000 0.00000 139:# if ( $current- - 0 0.00000 0.00000 140:# $current->set_value( - 0 0.00000 0.00000 141:# } - 0 0.00000 0.00000 142: # currently doesn't work, as - 0 0.00000 0.00000 143: # maybe change ? - 25000 0.28121 0.53000 144: $current->set_value( $characters - 25000 0.01730 0.20000 145: $characters = q{}; - 0 0.00000 0.00000 146: # set appropriate attribute in - 0 0.00000 0.00000 147: # multiple values must be - 0 0.00000 0.00000 148: #$_method = "add_$_localname"; - 25000 0.01976 0.23000 149: $_method = "add_$_[1]"; - 25000 0.55083 0.85000 150: $list->[-1]->$_method( $current - 0 0.00000 0.00000 151: - 25000 0.02277 0.25000 152: $current = pop @$list; - 25000 0.06949 0.36000 153: return; - 0 0.00000 0.00000 154: } - 1000 0.12369 0.12000 155: ); - 1000 0.13620 0.08000 156: return $parser; - 0 0.00000 0.00000 157:} - 0 0.00000 0.00000 158: - 0 0.00000 0.00000 159:sub parse { - 1000 0.00065 0.02000 160: eval { - 1000 0.07514 0.09000 161: $_[0]->_initialize( - 0 0.00000 0.00000 162: XML::Parser::Expat->new( - 0 0.00000 0.00000 163: Namespaces => 1 - 0 0.00000 0.00000 164: ) - 0 0.00000 0.00000 165: )->parse( $_[1] ); - 1000 0.01077 0.02000 166: $_[0]->{ parser }->release(); - 0 0.00000 0.00000 167: }; - 1000 0.00051 0.00000 168: die $@ if $@; - ================ SmallProf version 2.02 ================ - Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 4 - ================================================================= - count wall tm cpu time line - 1000 0.01431 0.04000 169: return $_[0]->{ data }; - 0 0.00000 0.00000 170:} - 0 0.00000 0.00000 171: - 0 0.00000 0.00000 172:sub parsefile { - 0 0.00000 0.00000 173: eval { - 0 0.00000 0.00000 174: $_[0]->_initialize( - 0 0.00000 0.00000 175: $_[0]->{ parser }->release(); - 0 0.00000 0.00000 176: }; - 0 0.00000 0.00000 177: die $@, $_[1] if $@; - 0 0.00000 0.00000 178: return $_[0]->{ data }; - 0 0.00000 0.00000 179:} - 0 0.00000 0.00000 180: - 0 0.00000 0.00000 181:# SAX-like aliases - 0 0.00000 0.00000 182:sub parse_string; - 0 0.00000 0.00000 183:*parse_string = \&parse; - 0 0.00000 0.00000 184: - 0 0.00000 0.00000 185:sub parse_file; - 0 0.00000 0.00000 186:*parse_file = \&parsefile; - 0 0.00000 0.00000 187: - 0 0.00000 0.00000 188:sub get_data { - 0 0.00000 0.00000 189: return $_[0]->{ data }; - 0 0.00000 0.00000 190:} - 0 0.00000 0.00000 191: - 0 0.00000 0.00000 192:1; - 0 0.00000 0.00000 193: - 0 0.00000 0.00000 194:=pod - ================ SmallProf version 2.02 ================ - Profile of 01_expat.t Page 5 - ================================================================= - count wall tm cpu time line - 0 0.00000 0.00000 1:#!/usr/bin/perl -w - 1 0.00002 0.00000 2:%DB::packages=(SOAP::WSDL::Expat::MessagePars - 0 0.00000 0.00000 3:use strict; - 0 0.00000 0.00000 4:use warnings; - 0 0.00000 0.00000 5:use lib '../lib'; - 0 0.00000 0.00000 6:use lib 'lib'; - 0 0.00000 0.00000 7:use lib '../t/lib'; - 0 0.00000 0.00000 8:use SOAP::WSDL::SAX::MessageHandler; - 0 0.00000 0.00000 9: - 0 0.00000 0.00000 10:use Benchmark; - 0 0.00000 0.00000 11:use SOAP::WSDL::Expat::MessageParser; - 0 0.00000 0.00000 12:use SOAP::WSDL::Expat::Message2Hash; - 0 0.00000 0.00000 13:use XML::Simple; - 0 0.00000 0.00000 14:use XML::LibXML; - 0 0.00000 0.00000 15:use MyComplexType; - 0 0.00000 0.00000 16:use MyElement; - 0 0.00000 0.00000 17:use MySimpleType; - 0 0.00000 0.00000 18: - 0 0.00000 0.00000 19:my $xml = q{Test - 0 0.00000 0.00000 23: Test2 - 0 0.00000 0.00000 24: Test2 - 0 0.00000 0.00000 25: Test2 - 0 0.00000 0.00000 26: Test2 - 0 0.00000 0.00000 27: Test2 - 0 0.00000 0.00000 28: Test2 - 0 0.00000 0.00000 29: Test2 - 0 0.00000 0.00000 30: Test2 - 0 0.00000 0.00000 31: Test2 - 0 0.00000 0.00000 32: Test2 - 0 0.00000 0.00000 33: Test2 - 0 0.00000 0.00000 34: Test2 - 0 0.00000 0.00000 35: Test2 - 0 0.00000 0.00000 36: Test - 0 0.00000 0.00000 37: Test - 0 0.00000 0.00000 38: Test - 0 0.00000 0.00000 39: Test - 0 0.00000 0.00000 40: Test - 0 0.00000 0.00000 41: Test - 0 0.00000 0.00000 42: Test - 0 0.00000 0.00000 43: Test - 0 0.00000 0.00000 44: Test - 0 0.00000 0.00000 45: Test - 0 0.00000 0.00000 46: Test - 0 0.00000 0.00000 47: - 0 0.00000 0.00000 48:}; - 0 0.00000 0.00000 49: - 0 0.00000 0.00000 50: - 0 0.00000 0.00000 51:my $parser = - 0 0.00000 0.00000 52: class_resolver => 'FakeResolver' - 0 0.00000 0.00000 53:}); - 0 0.00000 0.00000 54: - 0 0.00000 0.00000 55:my $hash_parser = - 0 0.00000 0.00000 56: - ================ SmallProf version 2.02 ================ - Profile of 01_expat.t Page 6 - ================================================================= - count wall tm cpu time line - 0 0.00000 0.00000 57:$XML::Simple::PREFERRED_PARSER = - 0 0.00000 0.00000 58: - 0 0.00000 0.00000 59:my $libxml = XML::LibXML->new(); - 0 0.00000 0.00000 60:my @data; - 0 0.00000 0.00000 61:timethese 1000, - 0 0.00000 0.00000 62:{ - 0 0.00000 0.00000 63:# 'SOAP::WSDL Hash' => sub { push @data, - 0 0.00000 0.00000 64: 'SOAP::WSDL' => sub { push @data, $parser- - 0 0.00000 0.00000 65:# 'XML::Simple (Hash)' => sub { push @data, - 0 0.00000 0.00000 66:# 'XML::LibXML (DOM)' => sub { push @data, - 0 0.00000 0.00000 67:}; - 0 0.00000 0.00000 68: - 0 0.00000 0.00000 69:# use Test::More tests => 1; - 0 0.00000 0.00000 70:#is $parser->get_data(), - 0 0.00000 0.00000 71:# . q{Testclass_resolver( 'FakeResolver2' ); - 0 0.00000 0.00000 75: - 0 0.00000 0.00000 76: - 0 0.00000 0.00000 77:# data classes reside in t/lib/Typelib/ - 0 0.00000 0.00000 78:BEGIN { - 0 0.00000 0.00000 79: package FakeResolver; - 0 0.00000 0.00000 80: { - 0 0.00000 0.00000 81: my %class_list = ( - 0 0.00000 0.00000 82: 'MyAtomicComplexTypeElement' => - 0 0.00000 0.00000 83: 'MyAtomicComplexTypeElement/test' - 0 0.00000 0.00000 84: - 0 0.00000 0.00000 85: ); - 0 0.00000 0.00000 86: - 0 0.00000 0.00000 87: sub get_map { return \%class_list }; - 0 0.00000 0.00000 88: - 0 0.00000 0.00000 89: sub new { return bless {}, - 0 0.00000 0.00000 90: - 0 0.00000 0.00000 91: sub get_class { - 0 0.00000 0.00000 92: my $name = join('/', @{ $_[1] }); - 0 0.00000 0.00000 93: return ($class_list{ $name }) ? - 0 0.00000 0.00000 94: : warn "no class found for - 0 0.00000 0.00000 95: }; - 0 0.00000 0.00000 96: }; - 0 0.00000 0.00000 97:}; diff --git a/example/fortune.pl b/example/fortune.pl index 3a52148..86ba476 100644 --- a/example/fortune.pl +++ b/example/fortune.pl @@ -10,21 +10,21 @@ # Eigene Dateien/Martin/SOAP-WSDL/trunk/bin/FortuneCookie.xml" use lib 'lib/'; -use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie; -my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new(); +use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap; +my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new(); my $cookie; $cookie = $cookieService->GetFortuneCookie() or die "$cookie"; -print $cookie; # ->get_GetFortuneCookieResult()->get_value, "\n"; +print $cookie->get_GetFortuneCookieResult()->get_value, "\n\n"; $cookie = $cookieService->GetSpecificCookie({ index => 23 }) or die "$cookie"; print $cookie->get_GetSpecificCookieResult(), "\n"; -print $cookie; +# print $cookie; =for demo: diff --git a/example/lib/MyElements/CountCookies.pm b/example/lib/MyElements/CountCookies.pm index c57423f..2c022d1 100644 --- a/example/lib/MyElements/CountCookies.pm +++ b/example/lib/MyElements/CountCookies.pm @@ -1,29 +1,8 @@ package MyElements::CountCookies; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - - -__PACKAGE__->_factory( - [ qw() ], - { - - }, - { - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } @@ -31,41 +10,45 @@ __PACKAGE__->__set_name('CountCookies'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); + + + + +} # end of BLOCK 1; - -__END__ +# __END__ =pod -=head1 NAME MyElements::CountCookies +=head1 NAME -=head1 SYNOPSIS +MyElements::CountCookies =head1 DESCRIPTION -Type class for the XML element CountCookies. +Perl data type class for the XML Schema defined element +CountCookies from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new + + my $element = MyElements::CountCookies->new($data); + +Constructor. The following data structure may be passed to new(): -=head1 Object structure +=head1 AUTHOR -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/CountCookiesResponse.pm b/example/lib/MyElements/CountCookiesResponse.pm index 93f48d3..745dd5f 100644 --- a/example/lib/MyElements/CountCookiesResponse.pm +++ b/example/lib/MyElements/CountCookiesResponse.pm @@ -1,37 +1,8 @@ package MyElements::CountCookiesResponse; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - -my %CountCookiesResult_of :ATTR(:get); - - -__PACKAGE__->_factory( - [ qw( - CountCookiesResult - ) ], - { - CountCookiesResult => \%CountCookiesResult_of, - - }, - { - - CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', - - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } @@ -39,47 +10,70 @@ __PACKAGE__->__set_name('CountCookiesResponse'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %CountCookiesResult_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + CountCookiesResult + ) ], + { + CountCookiesResult => \%CountCookiesResult_of, + }, + { + CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK 1; - -__END__ +# __END__ =pod -=head1 NAME MyElements::CountCookiesResponse +=head1 NAME -=head1 SYNOPSIS +MyElements::CountCookiesResponse =head1 DESCRIPTION -Type class for the XML element CountCookiesResponse. +Perl data type class for the XML Schema defined element +CountCookiesResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new - CountCookiesResult + my $element = MyElements::CountCookiesResponse->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): - CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', - + { + CountCookiesResult => $some_value, # int + } -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'CountCookiesResponse'=> { - 'CountCookiesResult' => $someValue, - }, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/GenerateBarCode.pm b/example/lib/MyElements/GenerateBarCode.pm new file mode 100644 index 0000000..3a8187c --- /dev/null +++ b/example/lib/MyElements/GenerateBarCode.pm @@ -0,0 +1,102 @@ +package MyElements::GenerateBarCode; +use strict; +use warnings; + +{ # BLOCK to scope variables + +sub get_xmlns { 'http://www.webservicex.net/' } + +__PACKAGE__->__set_name('GenerateBarCode'); +__PACKAGE__->__set_nillable(); +__PACKAGE__->__set_minOccurs(); +__PACKAGE__->__set_maxOccurs(); +__PACKAGE__->__set_ref(); + +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %BarCodeParam_of :ATTR(:get); +my %BarCodeText_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + BarCodeParam + BarCodeText + ) ], + { + BarCodeParam => \%BarCodeParam_of, + BarCodeText => \%BarCodeText_of, + }, + { + BarCodeParam => 'MyTypes::BarCodeData', + BarCodeText => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK +1; + +# __END__ + +=pod + +=head1 NAME + +MyElements::GenerateBarCode + +=head1 DESCRIPTION + +Perl data type class for the XML Schema defined element +GenerateBarCode from the namespace http://www.webservicex.net/. + +=head1 METHODS + +=head2 new + + my $element = MyElements::GenerateBarCode->new($data); + +Constructor. The following data structure may be passed to new(): + + { + BarCodeParam => { # MyTypes::BarCodeData + Height => $some_value, # int + Width => $some_value, # int + Angle => $some_value, # int + Ratio => $some_value, # int + Module => $some_value, # int + Left => $some_value, # int + Top => $some_value, # int + CheckSum => $some_value, # boolean + FontName => $some_value, # string + BarColor => $some_value, # string + BGColor => $some_value, # string + FontSize => $some_value, # float + barcodeOption => $some_value, # BarcodeOption + barcodeType => $some_value, # BarcodeType + checkSumMethod => $some_value, # CheckSumMethod + showTextPosition => $some_value, # ShowTextPosition + BarCodeImageFormat => $some_value, # ImageFormats + }, + BarCodeText => $some_value, # string + }, + +=head1 AUTHOR + +Generated by SOAP::WSDL + +=cut + diff --git a/example/lib/MyElements/GenerateBarCodeResponse.pm b/example/lib/MyElements/GenerateBarCodeResponse.pm new file mode 100644 index 0000000..bd9e2dc --- /dev/null +++ b/example/lib/MyElements/GenerateBarCodeResponse.pm @@ -0,0 +1,79 @@ +package MyElements::GenerateBarCodeResponse; +use strict; +use warnings; + +{ # BLOCK to scope variables + +sub get_xmlns { 'http://www.webservicex.net/' } + +__PACKAGE__->__set_name('GenerateBarCodeResponse'); +__PACKAGE__->__set_nillable(); +__PACKAGE__->__set_minOccurs(); +__PACKAGE__->__set_maxOccurs(); +__PACKAGE__->__set_ref(); + +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %GenerateBarCodeResult_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + GenerateBarCodeResult + ) ], + { + GenerateBarCodeResult => \%GenerateBarCodeResult_of, + }, + { + GenerateBarCodeResult => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK +1; + +# __END__ + +=pod + +=head1 NAME + +MyElements::GenerateBarCodeResponse + +=head1 DESCRIPTION + +Perl data type class for the XML Schema defined element +GenerateBarCodeResponse from the namespace http://www.webservicex.net/. + +=head1 METHODS + +=head2 new + + my $element = MyElements::GenerateBarCodeResponse->new($data); + +Constructor. The following data structure may be passed to new(): + + { + GenerateBarCodeResult => $some_value, # base64Binary + }, + +=head1 AUTHOR + +Generated by SOAP::WSDL + +=cut + diff --git a/example/lib/MyElements/GetCitiesByCountry.pm b/example/lib/MyElements/GetCitiesByCountry.pm index a294ade..25ae700 100644 --- a/example/lib/MyElements/GetCitiesByCountry.pm +++ b/example/lib/MyElements/GetCitiesByCountry.pm @@ -1,38 +1,8 @@ package MyElements::GetCitiesByCountry; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - -my %CountryName_of :ATTR(:get); - - -__PACKAGE__->_factory( - [ qw( - CountryName - ) ], - { - CountryName => \%CountryName_of, - - }, - { - - CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.webserviceX.NET' } @@ -40,54 +10,70 @@ __PACKAGE__->__set_name('GetCitiesByCountry'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %CountryName_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + CountryName + ) ], + { + CountryName => \%CountryName_of, + }, + { + CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK 1; - -__END__ - - - - - +# __END__ =pod -=head1 NAME +=head1 NAME MyElements::GetCitiesByCountry -=head1 SYNOPSIS - =head1 DESCRIPTION -Type class for the XML element GetCitiesByCountry. +Perl data type class for the XML Schema defined element +GetCitiesByCountry from the namespace http://www.webserviceX.NET. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new - CountryName + my $element = MyElements::GetCitiesByCountry->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): - CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - + { + CountryName => $some_value, # string + } -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'GetCitiesByCountry'=> { - 'CountryName' => $someValue, - }, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/GetCitiesByCountryResponse.pm b/example/lib/MyElements/GetCitiesByCountryResponse.pm index 7f4e87b..fe3b874 100644 --- a/example/lib/MyElements/GetCitiesByCountryResponse.pm +++ b/example/lib/MyElements/GetCitiesByCountryResponse.pm @@ -1,38 +1,8 @@ package MyElements::GetCitiesByCountryResponse; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - -my %GetCitiesByCountryResult_of :ATTR(:get); - - -__PACKAGE__->_factory( - [ qw( - GetCitiesByCountryResult - ) ], - { - GetCitiesByCountryResult => \%GetCitiesByCountryResult_of, - - }, - { - - GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.webserviceX.NET' } @@ -40,54 +10,70 @@ __PACKAGE__->__set_name('GetCitiesByCountryResponse'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %GetCitiesByCountryResult_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + GetCitiesByCountryResult + ) ], + { + GetCitiesByCountryResult => \%GetCitiesByCountryResult_of, + }, + { + GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK 1; - -__END__ - - - - - +# __END__ =pod -=head1 NAME +=head1 NAME MyElements::GetCitiesByCountryResponse -=head1 SYNOPSIS - =head1 DESCRIPTION -Type class for the XML element GetCitiesByCountryResponse. +Perl data type class for the XML Schema defined element +GetCitiesByCountryResponse from the namespace http://www.webserviceX.NET. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new - GetCitiesByCountryResult + my $element = MyElements::GetCitiesByCountryResponse->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): - GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - + { + GetCitiesByCountryResult => $some_value, # string + } -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'GetCitiesByCountryResponse'=> { - 'GetCitiesByCountryResult' => $someValue, - }, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/GetFortuneCookie.pm b/example/lib/MyElements/GetFortuneCookie.pm index a0041e4..116c0b5 100644 --- a/example/lib/MyElements/GetFortuneCookie.pm +++ b/example/lib/MyElements/GetFortuneCookie.pm @@ -1,29 +1,8 @@ package MyElements::GetFortuneCookie; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - - -__PACKAGE__->_factory( - [ qw() ], - { - - }, - { - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } @@ -31,41 +10,45 @@ __PACKAGE__->__set_name('GetFortuneCookie'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); + + + + +} # end of BLOCK 1; - -__END__ +# __END__ =pod -=head1 NAME MyElements::GetFortuneCookie +=head1 NAME -=head1 SYNOPSIS +MyElements::GetFortuneCookie =head1 DESCRIPTION -Type class for the XML element GetFortuneCookie. +Perl data type class for the XML Schema defined element +GetFortuneCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new + + my $element = MyElements::GetFortuneCookie->new($data); + +Constructor. The following data structure may be passed to new(): -=head1 Object structure +=head1 AUTHOR -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/GetFortuneCookieResponse.pm b/example/lib/MyElements/GetFortuneCookieResponse.pm index 571951a..a3868f8 100644 --- a/example/lib/MyElements/GetFortuneCookieResponse.pm +++ b/example/lib/MyElements/GetFortuneCookieResponse.pm @@ -1,37 +1,8 @@ package MyElements::GetFortuneCookieResponse; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - -my %GetFortuneCookieResult_of :ATTR(:get); - - -__PACKAGE__->_factory( - [ qw( - GetFortuneCookieResult - ) ], - { - GetFortuneCookieResult => \%GetFortuneCookieResult_of, - - }, - { - - GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } @@ -39,47 +10,70 @@ __PACKAGE__->__set_name('GetFortuneCookieResponse'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %GetFortuneCookieResult_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + GetFortuneCookieResult + ) ], + { + GetFortuneCookieResult => \%GetFortuneCookieResult_of, + }, + { + GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK 1; - -__END__ +# __END__ =pod -=head1 NAME MyElements::GetFortuneCookieResponse +=head1 NAME -=head1 SYNOPSIS +MyElements::GetFortuneCookieResponse =head1 DESCRIPTION -Type class for the XML element GetFortuneCookieResponse. +Perl data type class for the XML Schema defined element +GetFortuneCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new - GetFortuneCookieResult + my $element = MyElements::GetFortuneCookieResponse->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): - GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - + { + GetFortuneCookieResult => $some_value, # string + } -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'GetFortuneCookieResponse'=> { - 'GetFortuneCookieResult' => $someValue, - }, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/GetSpecificCookie.pm b/example/lib/MyElements/GetSpecificCookie.pm index 766438d..8b9dd3d 100644 --- a/example/lib/MyElements/GetSpecificCookie.pm +++ b/example/lib/MyElements/GetSpecificCookie.pm @@ -1,37 +1,8 @@ package MyElements::GetSpecificCookie; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - -my %index_of :ATTR(:get); - - -__PACKAGE__->_factory( - [ qw( - index - ) ], - { - index => \%index_of, - - }, - { - - index => 'SOAP::WSDL::XSD::Typelib::Builtin::int', - - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } @@ -39,47 +10,70 @@ __PACKAGE__->__set_name('GetSpecificCookie'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %index_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + index + ) ], + { + index => \%index_of, + }, + { + index => 'SOAP::WSDL::XSD::Typelib::Builtin::int', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK 1; - -__END__ +# __END__ =pod -=head1 NAME MyElements::GetSpecificCookie +=head1 NAME -=head1 SYNOPSIS +MyElements::GetSpecificCookie =head1 DESCRIPTION -Type class for the XML element GetSpecificCookie. +Perl data type class for the XML Schema defined element +GetSpecificCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new - index + my $element = MyElements::GetSpecificCookie->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): - index => 'SOAP::WSDL::XSD::Typelib::Builtin::int', - + { + index => $some_value, # int + } -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'GetSpecificCookie'=> { - 'index' => $someValue, - }, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/GetSpecificCookieResponse.pm b/example/lib/MyElements/GetSpecificCookieResponse.pm index ab29b06..a6c4778 100644 --- a/example/lib/MyElements/GetSpecificCookieResponse.pm +++ b/example/lib/MyElements/GetSpecificCookieResponse.pm @@ -1,37 +1,8 @@ package MyElements::GetSpecificCookieResponse; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - -my %GetSpecificCookieResult_of :ATTR(:get); - - -__PACKAGE__->_factory( - [ qw( - GetSpecificCookieResult - ) ], - { - GetSpecificCookieResult => \%GetSpecificCookieResult_of, - - }, - { - - GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } @@ -39,47 +10,70 @@ __PACKAGE__->__set_name('GetSpecificCookieResponse'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %GetSpecificCookieResult_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + GetSpecificCookieResult + ) ], + { + GetSpecificCookieResult => \%GetSpecificCookieResult_of, + }, + { + GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK 1; - -__END__ +# __END__ =pod -=head1 NAME MyElements::GetSpecificCookieResponse +=head1 NAME -=head1 SYNOPSIS +MyElements::GetSpecificCookieResponse =head1 DESCRIPTION -Type class for the XML element GetSpecificCookieResponse. +Perl data type class for the XML Schema defined element +GetSpecificCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new - GetSpecificCookieResult + my $element = MyElements::GetSpecificCookieResponse->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): - GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - + { + GetSpecificCookieResult => $some_value, # string + } -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'GetSpecificCookieResponse'=> { - 'GetSpecificCookieResult' => $someValue, - }, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/GetWeather.pm b/example/lib/MyElements/GetWeather.pm index 0070896..04b4320 100644 --- a/example/lib/MyElements/GetWeather.pm +++ b/example/lib/MyElements/GetWeather.pm @@ -1,46 +1,8 @@ package MyElements::GetWeather; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - -my %CityName_of :ATTR(:get); - -my %CountryName_of :ATTR(:get); - - -__PACKAGE__->_factory( - [ qw( - CityName - - CountryName - ) ], - { - CityName => \%CityName_of, - CountryName => \%CountryName_of, - - }, - { - - CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - - - CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.webserviceX.NET' } @@ -48,58 +10,75 @@ __PACKAGE__->__set_name('GetWeather'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %CityName_of :ATTR(:get); +my %CountryName_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + CityName + CountryName + ) ], + { + CityName => \%CityName_of, + CountryName => \%CountryName_of, + }, + { + CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK 1; - -__END__ - - - - - +# __END__ =pod -=head1 NAME +=head1 NAME MyElements::GetWeather -=head1 SYNOPSIS - =head1 DESCRIPTION -Type class for the XML element GetWeather. +Perl data type class for the XML Schema defined element +GetWeather from the namespace http://www.webserviceX.NET. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new - CityName - CountryName + my $element = MyElements::GetWeather->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): - CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - - CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - + { + CityName => $some_value, # string + CountryName => $some_value, # string + } -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'GetWeather'=> { - 'CityName' => $someValue, - 'CountryName' => $someValue, - }, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/GetWeatherResponse.pm b/example/lib/MyElements/GetWeatherResponse.pm index c259ea1..287395c 100644 --- a/example/lib/MyElements/GetWeatherResponse.pm +++ b/example/lib/MyElements/GetWeatherResponse.pm @@ -1,38 +1,8 @@ package MyElements::GetWeatherResponse; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - -my %GetWeatherResult_of :ATTR(:get); - - -__PACKAGE__->_factory( - [ qw( - GetWeatherResult - ) ], - { - GetWeatherResult => \%GetWeatherResult_of, - - }, - { - - GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.webserviceX.NET' } @@ -40,54 +10,70 @@ __PACKAGE__->__set_name('GetWeatherResponse'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %GetWeatherResult_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + GetWeatherResult + ) ], + { + GetWeatherResult => \%GetWeatherResult_of, + }, + { + GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK 1; - -__END__ - - - - - +# __END__ =pod -=head1 NAME +=head1 NAME MyElements::GetWeatherResponse -=head1 SYNOPSIS - =head1 DESCRIPTION -Type class for the XML element GetWeatherResponse. +Perl data type class for the XML Schema defined element +GetWeatherResponse from the namespace http://www.webserviceX.NET. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new - GetWeatherResult + my $element = MyElements::GetWeatherResponse->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): - GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - + { + GetWeatherResult => $some_value, # string + } -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'GetWeatherResponse'=> { - 'GetWeatherResult' => $someValue, - }, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/int.pm b/example/lib/MyElements/int.pm index 51a3f4e..eccf137 100644 --- a/example/lib/MyElements/int.pm +++ b/example/lib/MyElements/int.pm @@ -1,17 +1,8 @@ package MyElements::int; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - -# -# definition -# - -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::Builtin::int -); +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } @@ -19,42 +10,43 @@ __PACKAGE__->__set_name('int'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::Builtin::int +); + + +} # end of BLOCK 1; - -__END__ +# __END__ =pod -=head1 NAME MyElements::int +=head1 NAME -=head1 SYNOPSIS +MyElements::int =head1 DESCRIPTION -Type class for the XML element int. +Perl data type class for the XML Schema defined element +int from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new + my $element = MyElements::int->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): + $some_value, # int -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'int' => $someValue, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/readNodeCount.pm b/example/lib/MyElements/readNodeCount.pm index 405975d..3a52485 100644 --- a/example/lib/MyElements/readNodeCount.pm +++ b/example/lib/MyElements/readNodeCount.pm @@ -1,29 +1,8 @@ package MyElements::readNodeCount; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - - -__PACKAGE__->_factory( - [ qw() ], - { - - }, - { - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } @@ -31,41 +10,45 @@ __PACKAGE__->__set_name('readNodeCount'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); + + + + +} # end of BLOCK 1; - -__END__ +# __END__ =pod -=head1 NAME MyElements::readNodeCount +=head1 NAME -=head1 SYNOPSIS +MyElements::readNodeCount =head1 DESCRIPTION -Type class for the XML element readNodeCount. +Perl data type class for the XML Schema defined element +readNodeCount from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new + + my $element = MyElements::readNodeCount->new($data); + +Constructor. The following data structure may be passed to new(): -=head1 Object structure +=head1 AUTHOR -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/readNodeCountResponse.pm b/example/lib/MyElements/readNodeCountResponse.pm index f7f769b..f4ac6e9 100644 --- a/example/lib/MyElements/readNodeCountResponse.pm +++ b/example/lib/MyElements/readNodeCountResponse.pm @@ -1,37 +1,8 @@ package MyElements::readNodeCountResponse; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - -# atomic complexType -# definition -use SOAP::WSDL::XSD::Typelib::ComplexType; -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::ComplexType -); - - -my %readNodeCountResult_of :ATTR(:get); - - -__PACKAGE__->_factory( - [ qw( - readNodeCountResult - ) ], - { - readNodeCountResult => \%readNodeCountResult_of, - - }, - { - - readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', - - - } -); - +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } @@ -39,47 +10,70 @@ __PACKAGE__->__set_name('readNodeCountResponse'); __PACKAGE__->__set_nillable(); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::ComplexType +); +use Class::Std::Storable; +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +{ # BLOCK to scope variables + +my %readNodeCountResult_of :ATTR(:get); + +__PACKAGE__->_factory( + [ qw( + readNodeCountResult + ) ], + { + readNodeCountResult => \%readNodeCountResult_of, + }, + { + readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', + } +); + +} # end BLOCK + + + + + + + +} # end of BLOCK 1; - -__END__ +# __END__ =pod -=head1 NAME MyElements::readNodeCountResponse +=head1 NAME -=head1 SYNOPSIS +MyElements::readNodeCountResponse =head1 DESCRIPTION -Type class for the XML element readNodeCountResponse. +Perl data type class for the XML Schema defined element +readNodeCountResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new - readNodeCountResult + my $element = MyElements::readNodeCountResponse->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): - readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', - + { + readNodeCountResult => $some_value, # int + } -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'readNodeCountResponse'=> { - 'readNodeCountResult' => $someValue, - }, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyElements/string.pm b/example/lib/MyElements/string.pm index b148ea3..044fa2a 100644 --- a/example/lib/MyElements/string.pm +++ b/example/lib/MyElements/string.pm @@ -1,18 +1,8 @@ package MyElements::string; use strict; -use Class::Std::Storable; -use SOAP::WSDL::XSD::Typelib::Element; - - -# -# definition -# - -use base qw( - SOAP::WSDL::XSD::Typelib::Element - SOAP::WSDL::XSD::Typelib::Builtin::string -); +use warnings; +{ # BLOCK to scope variables sub get_xmlns { 'http://www.webserviceX.NET' } @@ -20,49 +10,43 @@ __PACKAGE__->__set_name('string'); __PACKAGE__->__set_nillable(true); __PACKAGE__->__set_minOccurs(); __PACKAGE__->__set_maxOccurs(); -__PACKAGE__->__set_ref(''); +__PACKAGE__->__set_ref(); +use base qw( + SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::Builtin::string +); + + +} # end of BLOCK 1; - -__END__ - - - - - +# __END__ =pod -=head1 NAME +=head1 NAME MyElements::string -=head1 SYNOPSIS - =head1 DESCRIPTION -Type class for the XML element string. +Perl data type class for the XML Schema defined element +string from the namespace http://www.webserviceX.NET. -=head1 PROPERTIES +=head1 METHODS -The following properties may be accessed using get_PROPERTY / set_PROPERTY -methods: +=head2 new + my $element = MyElements::string->new($data); -=head1 Object structure +Constructor. The following data structure may be passed to new(): + $some_value, # string -Structure as perl hash: - - The object structure is displayed as hash below though this is not correct. - Complex hash elements actually are objects of their corresponding classes - (look for classes of the same name in your typleib). - new() will accept a hash structure like this, but transform it to a object - tree. - - 'string' => $someValue, +=head1 AUTHOR +Generated by SOAP::WSDL =cut diff --git a/example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm b/example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm deleted file mode 100644 index fab733e..0000000 --- a/example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm +++ /dev/null @@ -1,327 +0,0 @@ -package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie; -use strict; -use warnings; -use MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie; -use base 'SOAP::WSDL::Client::Base'; - -sub new { - my $class = shift; - my $arg_ref = shift || {}; - my $self = $class->SUPER::new({ - class_resolver => 'MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie', - proxy => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx', - %{ $arg_ref } - }); - return bless $self, $class; -} - -__PACKAGE__->__create_methods( - GetSpecificCookie => [ 'MyElements::GetSpecificCookie', ], - CountCookies => [ 'MyElements::CountCookies', ], - readNodeCount => [ 'MyElements::readNodeCount', ], - GetFortuneCookie => [ 'MyElements::GetFortuneCookie', ], - -); - -1; - -__END__ - -=pod - -=head1 NAME - -MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie - SOAP interface to FullerData_x0020_Fortune_x0020_Cookie at -http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx - -=head1 SYNOPSIS - - my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new(); - my $CountCookies = $interface->CountCookies(); - - -=head1 Service FullerData_x0020_Fortune_x0020_Cookie - -=head2 Service information: - - Port name: FullerData_x0020_Fortune_x0020_CookieSoap - Binding: tns:FullerData_x0020_Fortune_x0020_CookieSoap - Location: http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx - -=head2 SOAP Operations - -B - - Input, output and fault messages are stated as perl hash refs. - - These are only for informational purposes - the actual implementation - normally uses object trees, not hash refs, though the input messages - may be passed to the respective methods as hash refs and will be - converted to object trees automatically. - - -=head3 readNodeCount - -B - - { - } - - -B - - { - } - - -B - - - - -=head3 GetFortuneCookie - -B - - { - } - - -B - - { - } - - -B - - - - -=head3 CountCookies - -B - - { - } - - -B - - { - } - - -B - - - - -=head3 GetSpecificCookie - -B - - { - } - - -B - - { - } - - -B - - - -=head2 Service information: - - Port name: FullerData_x0020_Fortune_x0020_CookieHttpGet - Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpGet - Location: - -=head2 SOAP Operations - -B - - Input, output and fault messages are stated as perl hash refs. - - These are only for informational purposes - the actual implementation - normally uses object trees, not hash refs, though the input messages - may be passed to the respective methods as hash refs and will be - converted to object trees automatically. - - -=head3 readNodeCount - -B - - { - } - - -B - - { - } - - -B - - - - -=head3 GetFortuneCookie - -B - - { - } - - -B - - { - } - - -B - - - - -=head3 CountCookies - -B - - { - } - - -B - - { - } - - -B - - - - -=head3 GetSpecificCookie - -B - - { - } - - -B - - { - } - - -B - - - -=head2 Service information: - - Port name: FullerData_x0020_Fortune_x0020_CookieHttpPost - Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpPost - Location: - -=head2 SOAP Operations - -B - - Input, output and fault messages are stated as perl hash refs. - - These are only for informational purposes - the actual implementation - normally uses object trees, not hash refs, though the input messages - may be passed to the respective methods as hash refs and will be - converted to object trees automatically. - - -=head3 readNodeCount - -B - - { - } - - -B - - { - } - - -B - - - - -=head3 GetFortuneCookie - -B - - { - } - - -B - - { - } - - -B - - - - -=head3 CountCookies - -B - - { - } - - -B - - { - } - - -B - - - - -=head3 GetSpecificCookie - -B - - { - } - - -B - - { - } - - -B - - - - - -=cut - diff --git a/example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm b/example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm new file mode 100644 index 0000000..12eade0 --- /dev/null +++ b/example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm @@ -0,0 +1,191 @@ +package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap; +use strict; +use warnings; +use Class::Std::Storable; +use base qw(SOAP::WSDL::Client::Base); + +# only load if it hasn't been loaded before +require MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie + if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class'); + +sub START { + $_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy}; + $_[0]->set_class_resolver('MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie') + if not $_[2]->{class_resolver}; +} + +sub readNodeCount { + my ($self, $body, $header) = @_; + return $self->SUPER::call({ + operation => 'readNodeCount', + soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount', + style => 'document', + body => { + + 'use' => 'literal', + namespace => '', + encodingStyle => '', + parts => [qw( MyElements::readNodeCount )], + }, + header => { + + }, + headerfault => { + + } + }, $body, $header); +} + +sub GetFortuneCookie { + my ($self, $body, $header) = @_; + return $self->SUPER::call({ + operation => 'GetFortuneCookie', + soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie', + style => 'document', + body => { + + 'use' => 'literal', + namespace => '', + encodingStyle => '', + parts => [qw( MyElements::GetFortuneCookie )], + }, + header => { + + }, + headerfault => { + + } + }, $body, $header); +} + +sub CountCookies { + my ($self, $body, $header) = @_; + return $self->SUPER::call({ + operation => 'CountCookies', + soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies', + style => 'document', + body => { + + 'use' => 'literal', + namespace => '', + encodingStyle => '', + parts => [qw( MyElements::CountCookies )], + }, + header => { + + }, + headerfault => { + + } + }, $body, $header); +} + +sub GetSpecificCookie { + my ($self, $body, $header) = @_; + return $self->SUPER::call({ + operation => 'GetSpecificCookie', + soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie', + style => 'document', + body => { + + 'use' => 'literal', + namespace => '', + encodingStyle => '', + parts => [qw( MyElements::GetSpecificCookie )], + }, + header => { + + }, + headerfault => { + + } + }, $body, $header); +} + + + +1; + + + +__END__ + +=pod + +=head1 NAME + + +MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service + +=head1 DESCRIPTION + +SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service +located at http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. + +=head1 SERVICE FullerData_x0020_Fortune_x0020_Cookie + +Simple XML-based fortune cookie + +=head2 Port FullerData_x0020_Fortune_x0020_CookieSoap + + + +=head1 METHODS + +=head2 General methods + +=head3 new + +Constructor. + +All arguments are forwarded to L. + +=head2 SOAP Service methods + +Method synopsis is displayed with hash refs as parameters. + +The commented class names in the method's parameters denote that objects +of the corresponding class can be passed instead of the marked hash ref. + +You may pass any combination of objects, hash and list refs to these +methods, as long as you meet the structure. + + + +=head3 readNodeCount + +Display the number of nodes specified in fortune XML document + + $interface->readNodeCount(, + ); + +=head3 GetFortuneCookie + +Get a random fortune cookie from the XML document + + $interface->GetFortuneCookie(, + ); + +=head3 CountCookies + +Count the actual number of nodes in the XML document of fortunes + + $interface->CountCookies(, + ); + +=head3 GetSpecificCookie + +Get a specific cookie by the XML node number + + $interface->GetSpecificCookie( { + index => $some_value, # int + }, + ); + + + +=head1 AUTHOR + +Generated by SOAP::WSDL on Tue Nov 6 20:56:46 2007 + +=pod \ No newline at end of file diff --git a/example/lib/MyInterfaces/GlobalWeather.pm b/example/lib/MyInterfaces/GlobalWeather.pm deleted file mode 100644 index af188a1..0000000 --- a/example/lib/MyInterfaces/GlobalWeather.pm +++ /dev/null @@ -1,83 +0,0 @@ -package MyInterfaces::GlobalWeather; - -use strict; -use warnings; -use MyTypemaps::GlobalWeather; -use base 'SOAP::WSDL::Client::Base'; - -sub new { - my $class = shift; - my $arg_ref = shift || {}; - my $self = $class->SUPER::new({ - class_resolver => 'MyTypemaps::GlobalWeather', - proxy => 'http://www.webservicex.net/globalweather.asmx', - %{ $arg_ref } - }); - return bless $self, $class; -} - -__PACKAGE__->__create_methods( - GetWeather => { - parts => [ 'MyElements::GetWeather', ], - soap_action => 'http://www.webserviceX.NET/GetWeather', - style => 'document', - # use => '', # use not implemented yet - }, - GetCitiesByCountry => { - parts => [ 'MyElements::GetCitiesByCountry', ], - soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry', - style => 'document', - # use => '', # use not implemented yet - }, - -); - -1; - -__END__ - - - - - -=pod - -=head1 NAME - -MyInterfaces::GlobalWeather - SOAP interface to GlobalWeather at -http://www.webservicex.net/globalweather.asmx - -=head1 SYNOPSIS - - my $interface = MyInterfaces::GlobalWeather->new(); - my $GetCitiesByCountry = $interface->GetCitiesByCountry(); - - -=head1 METHODS - -=head2 GetWeather - -Get weather report for all major cities around the world. - -SYNOPSIS: - - $service->GetWeather({ - 'CityName' => $someValue, - 'CountryName' => $someValue, - }); - - -=head2 GetCitiesByCountry - -Get all major cities by country name(full / part). - -SYNOPSIS: - - $service->GetCitiesByCountry({ - 'CountryName' => $someValue, - }); - - - -=pod - diff --git a/example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm b/example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm new file mode 100644 index 0000000..65c8100 --- /dev/null +++ b/example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm @@ -0,0 +1,136 @@ +package MyInterfaces::GlobalWeather::GlobalWeatherSoap; +use strict; +use warnings; +use Class::Std::Storable; +use base qw(SOAP::WSDL::Client::Base); + +# only load if it hasn't been loaded before +require MyTypemaps::GlobalWeather + if not MyTypemaps::GlobalWeather->can('get_class'); + +sub START { + $_[0]->set_proxy('http://www.webservicex.net/globalweather.asmx') if not $_[2]->{proxy}; + $_[0]->set_class_resolver('MyTypemaps::GlobalWeather') + if not $_[2]->{class_resolver}; +} + +sub GetWeather { + my ($self, $body, $header) = @_; + return $self->SUPER::call({ + operation => 'GetWeather', + soap_action => 'http://www.webserviceX.NET/GetWeather', + style => 'document', + body => { + + 'use' => 'literal', + namespace => '', + encodingStyle => '', + parts => [qw( MyElements::GetWeather )], + }, + header => { + + }, + headerfault => { + + } + }, $body, $header); +} + +sub GetCitiesByCountry { + my ($self, $body, $header) = @_; + return $self->SUPER::call({ + operation => 'GetCitiesByCountry', + soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry', + style => 'document', + body => { + + 'use' => 'literal', + namespace => '', + encodingStyle => '', + parts => [qw( MyElements::GetCitiesByCountry )], + }, + header => { + + }, + headerfault => { + + } + }, $body, $header); +} + + + +1; + + + +__END__ + +=pod + +=head1 NAME + + +MyInterfaces::GlobalWeather::GlobalWeatherSoap - SOAP Interface for the GlobalWeather Web Service + +=head1 DESCRIPTION + +SOAP Interface for the GlobalWeather web service +located at http://www.webservicex.net/globalweather.asmx. + +=head1 SERVICE GlobalWeather + + + +=head2 Port GlobalWeatherSoap + + + +=head1 METHODS + +=head2 General methods + +=head3 new + +Constructor. + +All arguments are forwarded to L. + +=head2 SOAP Service methods + +Method synopsis is displayed with hash refs as parameters. + +The commented class names in the method's parameters denote that objects +of the corresponding class can be passed instead of the marked hash ref. + +You may pass any combination of objects, hash and list refs to these +methods, as long as you meet the structure. + + + +=head3 GetWeather + +Get weather report for all major cities around the world. + + $interface->GetWeather( { + CityName => $some_value, # string + CountryName => $some_value, # string + }, + ); + +=head3 GetCitiesByCountry + +Get all major cities by country name(full / part). + + $interface->GetCitiesByCountry( { + CountryName => $some_value, # string + }, + ); + + + +=head1 AUTHOR + +Generated by SOAP::WSDL on Tue Nov 6 21:00:30 2007 + +=pod \ No newline at end of file diff --git a/example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm b/example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm index 4859370..821a84b 100644 --- a/example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm +++ b/example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm @@ -2,48 +2,47 @@ package MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie; use strict; use warnings; -my %typemap = ( -'readNodeCount' => 'MyElements::readNodeCount', -'readNodeCountResponse' => 'MyElements::readNodeCountResponse', -# atomic complex type (sequence) -'readNodeCountResponse/readNodeCountResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', - -# end atomic complex type (sequence) -'GetFortuneCookie' => 'MyElements::GetFortuneCookie', -'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse', -# atomic complex type (sequence) -'GetFortuneCookieResponse/GetFortuneCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - -# end atomic complex type (sequence) -'CountCookies' => 'MyElements::CountCookies', -'CountCookiesResponse' => 'MyElements::CountCookiesResponse', -# atomic complex type (sequence) -'CountCookiesResponse/CountCookiesResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', - -# end atomic complex type (sequence) -'GetSpecificCookie' => 'MyElements::GetSpecificCookie', -# atomic complex type (sequence) -'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', - -# end atomic complex type (sequence) -'GetSpecificCookieResponse' => 'MyElements::GetSpecificCookieResponse', -# atomic complex type (sequence) -'GetSpecificCookieResponse/GetSpecificCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - -# end atomic complex type (sequence) - - - - -); +our $typemap_1 = { + 'GetFortuneCookie' => 'MyElements::GetFortuneCookie', + 'CountCookiesResponse/CountCookiesResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', + 'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI', + 'readNodeCountResponse/readNodeCountResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', + 'CountCookiesResponse' => 'MyElements::CountCookiesResponse', + 'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'GetSpecificCookieResponse' => 'MyElements::GetSpecificCookieResponse', + 'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse', + 'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11', + 'GetSpecificCookie' => 'MyElements::GetSpecificCookie', + 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', + 'CountCookies' => 'MyElements::CountCookies', + 'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', + 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'GetFortuneCookieResponse/GetFortuneCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'GetSpecificCookieResponse/GetSpecificCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'readNodeCount' => 'MyElements::readNodeCount', + 'readNodeCountResponse' => 'MyElements::readNodeCountResponse' + }; +; sub get_class { my $name = join '/', @{ $_[1] }; - exists $typemap{ $name } or die "Cannot resolve $name via " . __PACKAGE__; - return $typemap{ $name }; + exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__; + return $typemap_1->{ $name }; } 1; __END__ +=pod + +=head1 NAME + +MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie; - typemap for ::FullerData_x0020_Fortune_x0020_Cookie; + +=head1 DESCRIPTION + +Typemap created by SOAP::WSDL for map-based SOAP message parsers. + +=cut + diff --git a/example/lib/MyTypemaps/GlobalWeather.pm b/example/lib/MyTypemaps/GlobalWeather.pm index 67f07f6..0958b34 100644 --- a/example/lib/MyTypemaps/GlobalWeather.pm +++ b/example/lib/MyTypemaps/GlobalWeather.pm @@ -2,49 +2,43 @@ package MyTypemaps::GlobalWeather; use strict; use warnings; -my %typemap = ( -# SOAP 1.1 fault typemap -'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11', -'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI', -'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', -'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', -'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - -# generated typemap -'GetWeather' => 'MyElements::GetWeather', -# atomic complex type (sequence) -'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', -'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - -# end atomic complex type (sequence) -'GetWeatherResponse' => 'MyElements::GetWeatherResponse', -# atomic complex type (sequence) -'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - -# end atomic complex type (sequence) -'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry', -# atomic complex type (sequence) -'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - -# end atomic complex type (sequence) -'GetCitiesByCountryResponse' => 'MyElements::GetCitiesByCountryResponse', -# atomic complex type (sequence) -'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - -# end atomic complex type (sequence) - - - - -); +our $typemap_1 = { + 'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'GetWeather' => 'MyElements::GetWeather', + 'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', + 'GetWeatherResponse' => 'MyElements::GetWeatherResponse', + 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI', + 'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry', + 'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', + 'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11', + 'GetCitiesByCountryResponse' => 'MyElements::GetCitiesByCountryResponse' + }; +; sub get_class { my $name = join '/', @{ $_[1] }; - exists $typemap{ $name } or die "Cannot resolve $name via " . __PACKAGE__; - return $typemap{ $name }; + exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__; + return $typemap_1->{ $name }; } 1; __END__ +=pod + +=head1 NAME + +MyTypemaps::GlobalWeather; - typemap for ::GlobalWeather; + +=head1 DESCRIPTION + +Typemap created by SOAP::WSDL for map-based SOAP message parsers. + +=cut + diff --git a/example/weather.pl b/example/weather.pl index e340fe9..be8dd3a 100644 --- a/example/weather.pl +++ b/example/weather.pl @@ -10,11 +10,13 @@ # This script demonstrates the use of a interface generated by wsdl2perl.pl use lib 'lib/'; -use MyInterfaces::GlobalWeather; -my $weather = MyInterfaces::GlobalWeather->new({ no_dispatch => 1 }); +use MyInterfaces::GlobalWeather::GlobalWeatherSoap; +my $weather = MyInterfaces::GlobalWeather::GlobalWeatherSoap->new(); my $result = $weather->GetWeather({ CountryName => 'Germany', CityName => 'Munich' }); -print $result; + # boolean comparison overloaded die $result->get_faultstring()->get_value() if not ($result); -print $result->get_GetWeatherResult()->get_value() , "\n"; +# The result is a XML string +# use get_value to avoid automatic entity encoding +print $result->get_GetWeatherResult()->get_value , "\n"; diff --git a/example/wsdl/genericbarcode.xml b/example/wsdl/genericbarcode.xml deleted file mode 100644 index 6363039..0000000 --- a/example/wsdl/genericbarcode.xml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - WebserviceX.NET barcode library that provides the means to create barcodes for printing and display in any internet enabled applications. This web service supports Code 128, Industrial 2 of 5, Interleaved 2 of 5, Code 2 5 Matrix, Code 39, Code 39 Extended, Code 93, Code 93 Extended, Codabar, EAN13, EAN8, MSI, Postnet, Supp2, Supp5, UPC A, UPC E0 and UPC E1 barcode formats. This Barcodes returns byte image. It supports following image format JPEG, GIF, PNG, BMP, EMF, EXIF, ICON, MEMORY BMP, TIFF and WMF. - - - - - - - - - - - - - - - - - - - - - - - - - - Barcode generator - - - - - - - - - - - \ No newline at end of file diff --git a/lib/SOAP/WSDL.pm b/lib/SOAP/WSDL.pm index 00eb787..01a03bd 100644 --- a/lib/SOAP/WSDL.pm +++ b/lib/SOAP/WSDL.pm @@ -48,20 +48,21 @@ my %LOOKUP = ( keep_alive => \%keep_alive_of, ); -sub readable { warn <{ $ident } = shift; return $self; @@ -73,39 +74,36 @@ for my $method (keys %LOOKUP ) { { # just a BLOCK for scoping warnings. # we need to roll our own for supporting - # SOAP::WSDL->new( key => value ) syntax, + # SOAP::WSDL->new( key => value ) syntax, # like SOAP::Lite does. Class::Std enforces a single hash ref as # parameters to new() - no warnings qw(redefine); + no warnings qw(redefine); ## no critic ProhibitNoWarnings; + sub new { - my $class = shift; - my %args_from = @_; + my ($class, %args_from) = @_; my $self = \do { my $foo = undef }; bless $self, $class; - for (keys %args_from) { my $method = $self->can("set_$_") or croak "unknown parameter $_ passed to new"; $method->($self, $args_from{$_}); } - my $ident = ident $self; + + my $ident = ident $self; $self->wsdlinit() if ($wsdl_of{ $ident }); - $client_of{ $ident } = SOAP::WSDL::Client->new(); - return $self; } } sub wsdlinit { - my $self = shift; + my ($self, %opt) = @_; my $ident = ident $self; - my %opt = @_; my $lwp = LWP::UserAgent->new( - $keep_alive_of{ $ident } + $keep_alive_of{ $ident } ? (keep_alive => 1) - : () + : () ); my $response = $lwp->get( $wsdl_of{ $ident } ); croak $response->message() if ($response->code != 200); @@ -117,10 +115,10 @@ sub wsdlinit { # sanity checks my $types = $wsdl_definitions->first_types() - or die "unable to extract schema from WSDL"; + or croak "unable to extract schema from WSDL"; my $ns = $wsdl_definitions->get_xmlns() - or die "unable to extract XML Namespaces" . $wsdl_definitions->to_string; - ( %{ $ns } ) or die "unable to extract XML Namespaces"; + or croak "unable to extract XML Namespaces" . $wsdl_definitions->to_string; + ( %{ $ns } ) or croak "unable to extract XML Namespaces"; # setup lookup variables $definitions_of{ $ident } = $wsdl_definitions; @@ -138,7 +136,7 @@ sub wsdlinit { sub _wsdl_get_service :PRIVATE { my $ident = ident shift; my $wsdl = $definitions_of{ $ident }; - return $service_of{ $ident } = $servicename_of{ $ident } + return $service_of{ $ident } = $servicename_of{ $ident } ? $wsdl->find_service( $wsdl->get_targetNamespace() , $servicename_of{ $ident } ) : $service_of{ $ident } = $wsdl->get_service()->[ 0 ]; } ## end sub _wsdl_get_service @@ -150,28 +148,25 @@ sub _wsdl_get_port :PRIVATE { return $port_of{ $ident } = $portname_of{ $ident } ? $service_of{ $ident }->get_port( $ns, $portname_of{ $ident } ) : $port_of{ $ident } = $service_of{ $ident }->get_port()->[ 0 ]; -} - +} sub _wsdl_get_binding :PRIVATE { my $self = shift; my $ident = ident $self; my $wsdl = $definitions_of{ $ident }; my $port = $port_of{ $ident } || $self->_wsdl_get_port(); $binding_of{ $ident } = $wsdl->find_binding( $port->expand( $port->get_binding() ) ) - or die "no binding found for ", $port->get_binding(); + or croak "no binding found for ", $port->get_binding(); return $binding_of{ $ident }; -} - +} sub _wsdl_get_portType :PRIVATE { my $self = shift; my $ident = ident $self; my $wsdl = $definitions_of{ $ident }; my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding(); $porttype_of{ $ident } = $wsdl->find_portType( $binding->expand( $binding->get_type() ) ) - or die "cannot find portType for " . $binding->get_type(); + or croak "cannot find portType for " . $binding->get_type(); return $porttype_of{ $ident }; -} - +} sub _wsdl_init_methods :PRIVATE { my $self = shift; my $ident = ident $self; @@ -181,7 +176,7 @@ sub _wsdl_init_methods :PRIVATE { # get bindings, portType, message, part(s) - use private methods for clear separation... $self->_wsdl_get_service if not ($service_of{ $ident }); my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding() - || die "Can't find binding"; + || croak "Can't find binding"; my $portType = $porttype_of{ $ident } || $self->_wsdl_get_portType(); $method_info_of{ $ident } = {}; @@ -202,35 +197,34 @@ sub _wsdl_init_methods :PRIVATE { $binding_operation->get_name() ); # 2. get input message name - my ( $prefix, $localname ) = split /:/, + my ( $prefix, $localname ) = split /:/xm, $operation->first_input()->get_message(); # 3. get input message my $message = $wsdl->find_message( $ns, $localname ) - or die "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()) { if ($body->get_parts()) { $method->{ parts } = []; # make sure it's empty my $message_part_ref = $message->get_part(); - for my $name (split m{\s} , $body->get_parts() ) { - $name =~s{ \A [^:]+: }{}x; # throw away ns prefix + for my $name ( split m{\s}xm , $body->get_parts() ) { + $name =~s{ \A [^:]+: }{}xm; # throw away ns prefix # could probably made more efficient, but our lists are # usually quite short - push @{ $method->{ parts } }, + push @{ $method->{ parts } }, grep { $_->get_name() eq $name } @{ $message_part_ref }; } - } + } } $method->{ parts } ||= $message->get_part(); - # rpc / encoded methods may have a namespace specified. # look it up and set it... - $method->{ namespace } = $binding_operation - ? do { - my $input = $binding_operation->first_input(); - $input ? $input->first_body()->get_namespace() : undef; + $method->{ namespace } = $binding_operation + ? do { + my $input = $binding_operation->first_input(); + $input ? $input->first_body()->get_namespace() : undef; } : undef; @@ -244,9 +238,9 @@ sub call { my ($self, $method, @data_from) = @_; my $ident = ident $self; - my ($data, $header) = ref $data_from[0] - ? ($data_from[0], $data_from[1] ) - : (@data_from>1) + my ($data, $header) = ref $data_from[0] + ? ($data_from[0], $data_from[1] ) + : (@data_from>1) ? ( { @data_from }, undef ) : ( $data_from[0], undef ); @@ -254,22 +248,22 @@ sub call { $self->_wsdl_init_methods() if not ($method_info_of{ $ident }); my $client = $client_of{ $ident }; - + # pass-through keep_alive if we need it... - $client->set_proxy( $proxy_of{ $ident } + $client->set_proxy( $proxy_of{ $ident } || $port_of{ $ident }->first_address()->get_location(), - $keep_alive_of{ $ident } ? (keep_alive => 1) : (), + $keep_alive_of{ $ident } ? (keep_alive => 1) : (), ); - + $client->set_no_dispatch( $no_dispatch_of{ $ident } ); $client->set_outputxml( $outputxml_of{ $ident } ? 1 : 0 ); # only load ::Deserializer::SOM if we really need to deserialize to SOM. - # maybe we should introduce something like $output{ $ident } with a fixed + # maybe we should introduce something like $output{ $ident } with a fixed # set of values - m{^(TREE|HASH|XML|SOM)$}xms ? if ( ( ! $outputtree_of{ $ident } ) - && ( ! $outputhash_of{ $ident } ) - && ( ! $outputxml_of{ $ident } ) + && ( ! $outputhash_of{ $ident } ) + && ( ! $outputxml_of{ $ident } ) && ( ! $no_dispatch_of{ $ident } ) ) { require SOAP::WSDL::Deserializer::SOM; $client->set_deserializer( SOAP::WSDL::Deserializer::SOM->new() ); @@ -278,18 +272,19 @@ sub call { my $method_info = $method_info_of{ $ident }->{ $method }; # TODO serialize both header and body, not only header - my (@response) = (blessed $data) + my (@response) = (blessed $data) ? $client->call( { operation => $method, soap_action => $method_info->{ soap_action }, }, $data ) : do { - my $content = ''; + my $content = q{}; # TODO support RPC-encoding: Top-Level element + namespace... foreach my $part ( @{ $method_info->{ parts } } ) { - $content .= $part->serialize( $method, $data, + + $content .= $part->serialize( $method, $data, { - %{ $serialize_options_of{ $ident } }, + %{ $serialize_options_of{ $ident } } } ); } $client->call( @@ -297,21 +292,20 @@ sub call { operation => $method, soap_action => $method_info->{ soap_action } }, - # absolutely stupid, but we need a reference which + # absolutely stupid, but we need a reference which # serializes to XML on stringification... SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({ value => $content - }), + }), SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({ value => $header }) ); }; - return unless @response; # nothing to do for one-ways + return if not @response; # nothing to do for one-ways return wantarray ? @response : $response[0]; -} - +} 1; __END__ @@ -327,7 +321,7 @@ SOAP::WSDL - SOAP with WSDL support For creating Perl classes instrumenting a web service with a WSDL definition, read L. -For using an interpreting (thus slow and somewhat troublesome) WSDL based +For using an interpreting (thus slow and somewhat troublesome) WSDL based SOAP client, which mimics L's API, read on. =head1 SYNOPSIS @@ -337,12 +331,12 @@ SOAP client, which mimics L's API, read on. ); my $result = $soap->call('MyMethod', %data); - + =head1 DESCRIPTION SOAP::WSDL provides easy access to Web Services with WSDL descriptions. -The WSDL is parsed and stored in memory. +The WSDL is parsed and stored in memory. Your data is serialized according to the rules in the WSDL. @@ -357,7 +351,7 @@ Constructor. All parameters passed are passed to the corresponding methods. =head2 call Performs a SOAP call. The result is either an object tree (with outputtree), -a hash reference (with outputhash), plain XML (with outputxml) or a SOAP::SOM +a hash reference (with outputhash), plain XML (with outputxml) or a SOAP::SOM object (with neither of the above set). call() can be called in different ways: @@ -374,13 +368,13 @@ Does not support SOAP header data. my $result = $soap->call('method', $body_ref, $header_ref ); -Does support SOAP header data. $body_ref and $header ref may either be +Does support SOAP header data. $body_ref and $header ref may either be hash refs or SOAP::WSDL::XSD::Typelib::* derived objects. Result headers are accessible via the result SOAP::SOM object. -If outputtree or outputhash are set, you may also use the following to -access response header data: +If outputtree or outputhash are set, you may also use the following to +access response header data: my ($body, $header) = $soap->call('method', $body_ref, $header_ref ); @@ -396,33 +390,33 @@ Is called automatically from call() if not called directly before. portname call -You may set servicename and portname by passing them as attributes to +You may set servicename and portname by passing them as attributes to wsdlinit: $soap->wsdlinit( servicename => 'MyService', - portname => 'MyPort' + portname => 'MyPort', ); =head1 CONFIGURATION METHODS =head2 outputtree -When outputtree is set, SOAP::WSDL will return an object tree instead of a +When outputtree is set, SOAP::WSDL will return an object tree instead of a SOAP::SOM object. -You have to specify a class_resolver for this to work. See +You have to specify a class_resolver for this to work. See L =head2 class_resolver Set the class resolver class (or object). -Class resolvers must implement the method get_class which has to return the -name of the class name for deserializing a XML node at the current XPath +Class resolvers must implement the method get_class which has to return the +name of the class name for deserializing a XML node at the current XPath location. -Class resolvers are typically generated by using the generate_typemap method +Class resolvers are typically generated by using the generate_typemap method of a SOAP::WSDL::Generator subclass. Example: @@ -442,18 +436,18 @@ Class resolver 'Person/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Person/FirstName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', ); - + sub get_class { return $typemap{ $_[1] } }; 1; -You'll need a MyPersonClass module in your search path for this to work - see -SOAP::WSDL::XSD::ComplexType on how to build / generate one. +You'll need a MyPersonClass module in your search path for this to work - see +SOAP::WSDL::XSD::ComplexType on how to build / generate one. =head2 servicename $soap->servicename('Name'); -Sets the service to operate on. If no service is set via servicename, the +Sets the service to operate on. If no service is set via servicename, the first service found is used. Returns the soap object, so you can chain calls like @@ -464,7 +458,7 @@ Returns the soap object, so you can chain calls like $soap->portname('Name'); -Sets the port to operate on. If no port is set via portname, the +Sets the port to operate on. If no port is set via portname, the first port found is used. Returns the soap object, so you can chain calls like @@ -473,14 +467,14 @@ Returns the soap object, so you can chain calls like =head2 no_dispatch -When set, call() returns the plain request XML instead of dispatching the +When set, call() returns the plain request XML instead of dispatching the SOAP call to the SOAP service. Handy for testing/debugging. =head1 ACCESS TO SOAP::WSDL's internals =head2 get_client / set_client -Returns the SOAP client implementation used (normally a SOAP::WSDL::Client +Returns the SOAP client implementation used (normally a SOAP::WSDL::Client object). =head1 EXAMPLES @@ -489,24 +483,24 @@ See the examples/ directory. =head1 Differences to previous versions -=over +=over =item * WSDL handling -SOAP::WSDL 2 is a complete rewrite. While SOAP::WSDL 1.x attempted to -process the WSDL file on the fly by using XPath queries, SOAP:WSDL 2 uses a -Expat handler for parsing the WSDL and building up a object tree representing +SOAP::WSDL 2 is a complete rewrite. While SOAP::WSDL 1.x attempted to +process the WSDL file on the fly by using XPath queries, SOAP:WSDL 2 uses a +Expat handler for parsing the WSDL and building up a object tree representing it's content. -The object tree has two main functions: It knows how to serialize data passed +The object tree has two main functions: It knows how to serialize data passed as hash ref, and how to render the WSDL elements found into perl classes. -Yup your're right, there's a builting code generation facility. Read +Yup your're right, there's a builting code generation facility. Read L for using it. -=item * no_dispatch +=item * no_dispatch -call() with no_dispatch set to true now returns the complete SOAP request +call() with no_dispatch set to true now returns the complete SOAP request envelope, not only the body's content. =item * outputxml @@ -526,21 +520,21 @@ You may pass the servicename and portname as attributes to wsdlinit, though. =head2 readable -readable is a no-op in SOAP::WSDL. Actually, the XML output from SOAP::Lite +readable is a no-op in SOAP::WSDL. Actually, the XML output from SOAP::Lite is hardly readable, either with readable switched on. -If you need readable XML messages, I suggest using your favorite XML editor +If you need readable XML messages, I suggest using your favorite XML editor for displaying and formatting. =head2 Message style/encoding -While SOAP::Lite supports rpc/encoded style/encoding only, SOAP::WSDL currently +While SOAP::Lite supports rpc/encoded style/encoding only, SOAP::WSDL currently supports document/literal style/encoding. =head2 autotype / type information -SOAP::Lite defaults to transmitting XML type information by default, where -SOAP::WSDL defaults to leaving it out. +SOAP::Lite defaults to transmitting XML type information by default, where +SOAP::WSDL defaults to leaving it out. autotype(1) might even be broken in SOAP::WSDL - it's not well-tested, yet. @@ -556,13 +550,13 @@ This is the default. SOAP::Lite is required for outputting SOAP::SOM objects. =item * Object trees. -This is the recommended output format. -You need a class resolver (typemap) for outputting object trees. +This is the recommended output format. +You need a class resolver (typemap) for outputting object trees. See L above. =item * Hash refs -This is for convnience: A single hash ref containing the content of the +This is for convnience: A single hash ref containing the content of the SOAP body. =item * xml @@ -588,26 +582,26 @@ SOAP::WSDL::Client and implementing something like $soap_wsdl_client->call( mySoapMethod, @_); } -You may even do this in a class factory - see L for creating +You may even do this in a class factory - see L for creating such interfaces. =head2 Debugging / Tracing -While SOAP::Lite features a global tracing facility, SOAP::WSDL +While SOAP::Lite features a global tracing facility, SOAP::WSDL allows to switch tracing on/of on a per-object base. -This has to be done in the SOAP client used by SOAP::WSDL - see -L for an example and L for +This has to be done in the SOAP client used by SOAP::WSDL - see +L for an example and L for details. -=head1 Bugs and Limitations +=head1 BUGS AND LIMITATIONS -=over +=over =item * perl 5.8.0 or higher required -SOAP::WSDL needs perl 5.8.0 or higher. This is due to a bug in perls -before - see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746 for details. +SOAP::WSDL needs perl 5.8.0 or higher. This is due to a bug in perls +before - see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746 for details. =item * Apache SOAP datatypes are not supported @@ -627,7 +621,7 @@ The following XML Schema definitions varieties are not supported: union simpleContent -The following XML Schema definition content model is only partially +The following XML Schema definition content model is only partially supported: complexContent - only restriction variety supported @@ -636,10 +630,10 @@ See L for details. =item * Serialization of hash refs dos not work for ambiguos values -If you have list elements with multiple occurences allowed, SOAP::WSDL +If you have list elements with multiple occurences allowed, SOAP::WSDL has no means of finding out which variant you meant. -Passing in item => [1,2,3] could serialize to +Passing in item => [1,2,3] could serialize to 1 23 12 3 @@ -648,7 +642,7 @@ Ambiguos data can be avoided by providing data as objects. =item * XML Schema facets -Almost no XML schema facets are implemented yet. The only facets +Almost no XML schema facets are implemented yet. The only facets currently implemented are: fixed @@ -677,20 +671,20 @@ The following facets have no influence yet: Full featured SOAP-library, little WSDL support. Supports rpc-encoded style only. Many protocols supported. -=item * +=item * L / L A promising-looking approach derived from a cool functional DOM-based XML schema parser. Will support encoding/decoding of SOAP messages based on WSDL definitions. -Not yet finished at the time of writing - but you may wish to give it a try, especially -if you need to adhere very closely to the XML Schema / WSDL specs. +Not yet finished at the time of writing - but you may wish to give it a try, especially +if you need to adhere very closely to the XML Schema / WSDL specs. =back =head2 Sources of documentation -=over +=over =item * SOAP::WSDL homepage at sourceforge.net @@ -704,30 +698,30 @@ L =head1 ACKNOWLEDGMENTS -There are many people out there who fostered SOAP::WSDL's developement. +There are many people out there who fostered SOAP::WSDL's developement. I would like to thank them all (and apologize to all those I have forgotten). -Giovanni S. Fois wrote a improved version of SOAP::WSDL (which eventually +Giovanni S. Fois wrote a improved version of SOAP::WSDL (which eventually became v1.23) David Bussenschutt, Damian A. Martinez Gelabert, Dennis S. Hennen, Dan Horne, -Peter Orvos, Mark Overmeer, Jon Robens, Isidro Vila Verde and Glenn Wood +Peter Orvos, Mark Overmeer, Jon Robens, Isidro Vila Verde and Glenn Wood spotted bugs and/or suggested improvements in the 1.2x releases. Andreas 'ac0v' Specht constantly asked for better performance. -JT Justman provided some early feedback for the 2.xx pre-releases. +JT Justman provided early feedback for the 2.xx pre-releases. Numerous people sent me their real-world WSDL files for testing. Thank you. -Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and +Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and thus provided a base (and counterpart) for SOAP::WSDL. -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT Copyright 2004-2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR @@ -736,10 +730,10 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 332 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - $Id: WSDL.pm 332 2007-10-19 07:29:03Z kutterma $ + $Id: WSDL.pm 391 2007-11-17 21:56:13Z kutterma $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $ - + =cut diff --git a/lib/SOAP/WSDL/Base.pm b/lib/SOAP/WSDL/Base.pm index eea7126..02c145c 100644 --- a/lib/SOAP/WSDL/Base.pm +++ b/lib/SOAP/WSDL/Base.pm @@ -3,7 +3,7 @@ use strict; use warnings; use Class::Std::Storable; use List::Util qw(first); -use Carp qw(confess); +use Carp qw(croak carp confess); our $VERSION='2.00_17'; @@ -18,6 +18,7 @@ sub DEMOLISH { my $self = shift; # delete upward references delete $parent_of{ ident $self }; + return; } sub STORABLE_freeze_pre :CUMULATIVE {}; @@ -31,8 +32,8 @@ sub _accept { $class =~ s{ \A SOAP::WSDL:: }{}xms; $class =~ s{ (:? :: ) }{_}gxms; my $method = "visit_$class"; - no strict qw(refs); - shift->$method( $self ); + no strict qw(refs); ## no critic ProhibitNoStrict + return shift->$method( $self ); } # unfortunately, AUTOMETHOD is SLOW. @@ -46,13 +47,13 @@ sub AUTOMETHOD { if ($subname =~s{^push_}{}xms) { my $getter = "get_$subname"; my $setter = "set_$subname"; - ## Checking here is paranoid - will fail fatally if + ## Checking here is paranoid - will fail fatally if ## there is no setter... ## And we would have to check getters, too. ## Maybe do it the Conway way via the Symbol table... ## ... can is way slow... return sub { - no strict qw(refs); + no strict qw(refs); ## no critic ProhibitNoStrict my $old_value = $self->$getter(); # Listify if not a list ref $old_value = $old_value ? [ $old_value ] : [] if not ref $old_value; @@ -85,13 +86,12 @@ sub AUTOMETHOD { } sub init { - my $self = shift; - my @args = @_; + my ($self, @args) = @_; foreach my $value (@args) { - die @args if (not defined ($value->{ Name })); + croak @args if (not defined ($value->{ Name })); if ($value->{ Name } =~m{^xmlns\:}xms) { - die $xmlns_of{ ident $self } + croak $xmlns_of{ ident $self } if ref $xmlns_of{ ident $self } ne 'HASH'; # add namespaces @@ -115,16 +115,27 @@ sub init { sub expand { my ($self, , $qname) = @_; - my ($prefix, $localname) = split /:/, $qname; + my ($prefix, $localname) = split /:/x, $qname; my %ns_map = reverse %{ $self->get_xmlns() }; return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix }); - + if (my $parent = $self->get_parent()) { return $parent->expand($qname); } confess "unbound prefix $prefix found for $prefix:$localname"; } -sub _expand; +sub _expand; *_expand = \&expand; 1; + +__END__ + +# REPOSITORY INFORMATION +# +# $Rev: 332 $ +# $LastChangedBy: kutterma $ +# $Id: WSDL.pm 332 2007-10-19 07:29:03Z kutterma $ +# $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $ +# + diff --git a/lib/SOAP/WSDL/Client.pm b/lib/SOAP/WSDL/Client.pm index bdff3ea..6853937 100644 --- a/lib/SOAP/WSDL/Client.pm +++ b/lib/SOAP/WSDL/Client.pm @@ -33,15 +33,15 @@ sub BUILD { $self->set_proxy( $attrs_of_ref->{ proxy } ); delete $attrs_of_ref->{ proxy }; } - + return; } -sub get_proxy { +sub get_proxy { ## no critic RequireArgUnpacking return $_[0]->get_transport(); } sub set_proxy { - my ($self, @args_from) = @_; + my ($self, @args_from) = @_; my $ident = ident $self; # remember old value to return it later - Class::Std does so, too @@ -49,7 +49,7 @@ sub set_proxy { # accept both list and list ref args @args_from = @{ $args_from[0] } if ref $args_from[0]; - + # remember endpoint $endpoint_of{ $ident } = $args_from[0]; @@ -66,22 +66,22 @@ sub set_soap_version { # remember old value to return it later - Class::Std does so, too my $soap_version = $soap_version_of{ $ident }; - # re-setting the soap version invalidates the + # re-setting the soap version invalidates the # serializer object delete $serializer_of{ $ident }; delete $deserializer_of{ $ident }; - - $soap_version_of{ $ident } = shift; - + + $soap_version_of{ $ident } = shift; + return $soap_version; } # Mimic SOAP::Lite's behaviour for getter/setter routines SUBFACTORY: { - no strict qw(refs); for (qw(class_resolver no_dispatch outputxml proxy)) { my $setter = "set_$_"; my $getter = "get_$_"; + no strict qw(refs); ## no critic ProhibitNoStrict *{ $_ } = sub { my $self = shift; if (@_) { $self->$setter(@_); @@ -96,33 +96,32 @@ sub call { my ($self, $method, @data_from) = @_; my $ident = ident $self; - # the only valid idiom for calling a method with both a header and a body + # the only valid idiom for calling a method with both a header and a body # is # ->call($method, $body_ref, $header_ref); # # These other idioms all assume an empty header: # ->call($method, %body_of); # %body_of is a hash # ->call($method, $body); # $body is a scalar - my ($data, $header) = ref $data_from[0] - ? ($data_from[0], $data_from[1] ) - : (@data_from>1) + my ($data, $header) = ref $data_from[0] + ? ($data_from[0], $data_from[1] ) + : (@data_from>1) ? ( { @data_from }, undef ) : ( $data_from[0], undef ); # get operation name and soap_action - my ($operation, $soap_action) = (ref $method eq 'HASH') + my ($operation, $soap_action) = (ref $method eq 'HASH') ? ( $method->{ operation }, $method->{ soap_action } ) - : (blessed $data + : (blessed $data && $data->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')) - ? ( $method , (join '/', $data->get_xmlns(), $method) ) + ? ( $method , (join q{/}, $data->get_xmlns(), $method) ) : ( $method, q{} ); - $serializer_of{ $ident } ||= SOAP::WSDL::Factory::Serializer->get_serializer({ soap_version => $self->get_soap_version(), }); my $envelope = $serializer_of{ $ident }->serialize({ - method => $operation, + method => $operation, body => $data, header => $header, }); @@ -131,7 +130,7 @@ sub call { # always quote SOAPAction header. # WS-I BP 1.0 R1109 - if ($soap_action) { + if ($soap_action) { $soap_action =~s{\A(:?"|')?}{"}xms; $soap_action =~s{(:?"|')?\Z}{"}xms; } @@ -140,9 +139,9 @@ sub call { } # get response via transport layer. - # Normally, SOAP::Lite's transport layer is used, though users + # Normally, SOAP::Lite's transport layer is used, though users # may provide their own. - my $transport = $self->get_transport(); + my $transport = $self->get_transport(); my $response = $transport->send_receive( endpoint => $self->get_endpoint(), content_type => $content_type_of{ $ident }, @@ -165,14 +164,14 @@ sub call { # Try deserializing response - there may be some, # even if transport did not succeed (got a 500 response) if ( $response ) { - my ($result_body, $result_header) = eval { - $deserializer_of{ $ident }->deserialize( $response ); + my ($result_body, $result_header) = eval { + $deserializer_of{ $ident }->deserialize( $response ); }; if (not $@) { - return wantarray + return wantarray ? ($result_body, $result_header) : $result_body; - } + } return $deserializer_of{ $ident }->generate_fault({ code => 'soap:Server', role => 'urn:localhost', @@ -206,12 +205,20 @@ __END__ SOAP::WSDL::Client - SOAP::WSDL's SOAP Client +=head1 SYNOPSIS + + use SOAP::WSDL::Client; + my $soap = SOAP::WSDL::Client->new({ + proxy => 'http://www.example.org/webservice/test' + }); + $soap->call( \%method, $body, $header); + =head1 METHODS =head2 call $soap->call( \%method, \@parts ); - + %method is a hash with the following keys: Name Description @@ -219,7 +226,7 @@ SOAP::WSDL::Client - SOAP::WSDL's SOAP Client operation operation name soap_action SOAPAction HTTP header to use style Operation style. One of (document|rpc) - use SOAP body encoding. One of (literal|encoded) + use SOAP body encoding. One of (literal|encoded) The style and use keys have no influence yet. @@ -229,12 +236,11 @@ For backward compatibility, call may also be called as below: $soap->call( $method, \@parts ); -In this case, $method is the SOAP operation name, and the SOAPAction header -is guessed from the first part's namespace and the operation name (which is -mostly correct, but may fail). Operation style and body encoding are assumed to +In this case, $method is the SOAP operation name, and the SOAPAction header +is guessed from the first part's namespace and the operation name (which is +mostly correct, but may fail). Operation style and body encoding are assumed to be document/literal - =head2 Configuration methods =head3 outputxml @@ -243,17 +249,17 @@ be document/literal When set, call() returns the raw XML of the SOAP Envelope. -=head3 set_content_type +=head3 set_content_type $soap->set_content_type('application/xml; charset: utf8'); -Sets the content type and character encoding. +Sets the content type and character encoding. -You probably should not use a character encoding different from utf8: -SOAP::WSDL::Client will not convert the request into a different encoding +You probably should not use a character encoding different from utf8: +SOAP::WSDL::Client will not convert the request into a different encoding (yet). -To leave out the encoding, just set the content type without appendet charset +To leave out the encoding, just set the content type without appendet charset like in text/xml @@ -269,8 +275,8 @@ Default: When set to a true value, tracing (via warn) is enabled. -When set to a code reference, this function will be called on every -trace call, making it really easy for you to set up log4perl logging +When set to a code reference, this function will be called on every +trace call, making it really easy for you to set up log4perl logging or whatever you need. =head2 Features different from SOAP::Lite @@ -336,28 +342,28 @@ SOAP::WSDL::Client and implementing something like $soap_wsdl_client->call( mySoapMethod, @_); } -You may even do this in a class factory - see L for creating +You may even do this in a class factory - see L for creating such interfaces. -=head1 Troubleshooting +=head1 TROUBLESHOOTING =head2 Accessing protected web services -Accessing protected web services is very specific for the transport +Accessing protected web services is very specific for the transport backend used. -In general, you may pass additional arguments to the set_proxy method (or -a list ref of the web service address and any additional arguments to the +In general, you may pass additional arguments to the set_proxy method (or +a list ref of the web service address and any additional arguments to the new method's I argument). Refer to the appropriate transport module for documentation. -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT Copyright 2004-2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under -the same terms as perl itself +This file is part of SOAP-WSDL. You may distribute/modify it under the same +terms as perl itself =head1 AUTHOR @@ -365,10 +371,10 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 303 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - $Id: Client.pm 303 2007-10-01 18:51:50Z kutterma $ + $Id: Client.pm 391 2007-11-17 21:56:13Z kutterma $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $ - + =cut diff --git a/lib/SOAP/WSDL/Client/Base.pm b/lib/SOAP/WSDL/Client/Base.pm index 07cac20..e5c4d4b 100644 --- a/lib/SOAP/WSDL/Client/Base.pm +++ b/lib/SOAP/WSDL/Client/Base.pm @@ -4,76 +4,57 @@ use warnings; use base 'SOAP::WSDL::Client'; use Scalar::Util qw(blessed); -our $VERSION = '2.00_17'; +our $VERSION = '2.00_24'; sub call { my ($self, $method, $body, $header) = @_; if (not blessed $body) { - $body = {} if not defined $body; + $body = {} if not defined $body; my $class = $method->{ body }->{ parts }->[0]; eval "require $class" || die $@; - $body = $class->new($body); + $body = $class->new($body); } - + # if we have a header if (%{ $method->{ header } }) { if (not blessed $header) { my $class = $method->{ header }->{ parts }->[0]; eval "require $class" || die $@; - $header = $class->new($header); + $header = $class->new($header); } } - return $self->SUPER::call($method, $body, $header); + return $self->SUPER::call($method, $body, $header); } -#sub __create_new { -# my ($package, %args_of) = @_; -# -# no strict qw(refs); -# no warnings qw(redefine); -# -# # TODO factor out and replace by generated START method -# *{ "$package\::new" } = sub { -# my $class = shift; -# my $self = $class->SUPER::new({ -# proxy => $args_of{ proxy }, -# class_resolver => $args_of{ class_resolver } -# }); -# bless $self, $class; -# return $self; -# } -#} - 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 { - @parts = @{ $info_of{ $method } }; - $soap_action = (); - } - - *{ "$package\::$method" } = sub { - my $self = shift; - my @param = map { + 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 ); + } @parts; + + return $self->SUPER::call( { + operation => $method, + soap_action => $soap_action, + }, @param ); } } } @@ -92,24 +73,20 @@ SOAP::WSDL::Client::Base - Factory class for WSDL-based SOAP access package MySoapInterface; use SOAP::WSDL::Client::Base; - __PACKAGE__->__create_new( - proxy => 'http://somewhere.over.the.rainbow', - class_resolver => 'Typemap::MySoapInterface' - ); __PACKAGE__->__create_methods( qw(one two three) ); 1; =head1 DESCRIPTION -Factory class for creating interface classes. Should probably be renamed to +Factory class for creating interface classes. Should probably be renamed to SOAP::WSDL::Factory::Interface... -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT Copyright 2004-2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under -the same terms as perl itself +This file is part of SOAP-WSDL. You may distribute/modify it under the same +terms as perl itself =head1 AUTHOR @@ -117,9 +94,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 323 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - $Id: Base.pm 323 2007-10-17 15:23:05Z kutterma $ + $Id: Base.pm 391 2007-11-17 21:56:13Z kutterma $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $ - + =cut diff --git a/lib/SOAP/WSDL/Definitions.pm b/lib/SOAP/WSDL/Definitions.pm index ea9b217..06a9ad2 100644 --- a/lib/SOAP/WSDL/Definitions.pm +++ b/lib/SOAP/WSDL/Definitions.pm @@ -19,7 +19,7 @@ my %service_of :ATTR(:name :default<()>); my %namespace_of :ATTR(:name :default<()>); # must be attr for Class::Std::Storable -my %attributes_of :ATTR(); +my %attributes_of :ATTR(); %attributes_of = ( binding => \%binding_of, message => \%message_of, @@ -29,30 +29,21 @@ my %attributes_of :ATTR(); # Function factory - we could be writing this method for all %attribute # keys, too, but that's just C&P (eehm, Copy & Paste...) -BLOCK: { - no strict qw/refs/; +BLOCK: { foreach my $method(keys %attributes_of ) { - + no strict qw/refs/; ## no critic ProhibitNoStrict *{ "find_$method" } = sub { my ($self, @args_from) = @_; @args_from = @{ $args_from[0] } if ref $args_from[0] eq 'ARRAY'; - return first { - $_->get_targetNamespace() eq $args_from[0] - && $_->get_name() eq $args_from[1] + return first { + $_->get_targetNamespace() eq $args_from[0] + && $_->get_name() eq $args_from[1] } @{ $attributes_of{ $method }->{ ident $self } }; }; } } -#sub listify { -# my $data = shift; -# return if not defined $data; -# return [ $data ] if not ref $data; -# return [ $data ] if not ref $data eq 'ARRAY'; -# return $data; -#} - 1; =pod @@ -67,7 +58,7 @@ SOAP::WSDL::Definitions - model a WSDL EdefinitionsE element =head2 first_service get_service set_service push_service -Accessors/Mutators for accessing / setting the EserviceE child +Accessors/Mutators for accessing / setting the EserviceE child element(s). =head2 find_service @@ -78,7 +69,7 @@ Returns the service matching the namespace/localname pair passed as arguments. =head2 first_binding get_binding set_binding push_binding -Accessors/Mutators for accessing / setting the EbindingE child +Accessors/Mutators for accessing / setting the EbindingE child element(s). =head2 find_service @@ -89,7 +80,7 @@ Returns the binding matching the namespace/localname pair passed as arguments. =head2 first_portType get_portType set_portType push_portType -Accessors/Mutators for accessing / setting the EportTypeE child +Accessors/Mutators for accessing / setting the EportTypeE child element(s). =head2 find_portType @@ -100,7 +91,7 @@ Returns the portType matching the namespace/localname pair passed as arguments. =head2 first_message get_message set_message push_message -Accessors/Mutators for accessing / setting the EmessageE child +Accessors/Mutators for accessing / setting the EmessageE child element(s). =head2 find_service @@ -111,19 +102,26 @@ Returns the message matching the namespace/localname pair passed as arguments. =head2 first_types get_types set_types push_types -Accessors/Mutators for accessing / setting the EtypesE child +Accessors/Mutators for accessing / setting the EtypesE child element(s). -=head1 LICENSE +=head1 LICENSE and COPYRIGHT Copyright 2004-2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR Martin Kutter Emartin.kutter fen-net.deE +=head1 REPOSITORY INFORMATION + + $Rev: 391 $ + $LastChangedBy: kutterma $ + $Id: Definitions.pm 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $ + =cut diff --git a/lib/SOAP/WSDL/Deserializer/Hash.pm b/lib/SOAP/WSDL/Deserializer/Hash.pm index 16f0218..70d28aa 100644 --- a/lib/SOAP/WSDL/Deserializer/Hash.pm +++ b/lib/SOAP/WSDL/Deserializer/Hash.pm @@ -8,11 +8,11 @@ use SOAP::WSDL::Expat::Message2Hash; use SOAP::WSDL::Factory::Deserializer; SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ ); -our $VERSION='2.00_17'; +our $VERSION='2.00_24'; sub BUILD { my ($self, $ident, $args_of_ref) = @_; - + # ignore all options for (keys %{ $args_of_ref }) { delete $args_of_ref->{ $_ } @@ -21,7 +21,7 @@ sub BUILD { sub deserialize { my ($self, $content) = @_; - + my $parser = SOAP::WSDL::Expat::Message2Hash->new(); eval { $parser->parse_string( $content ) }; if ($@) { @@ -41,7 +41,7 @@ sub generate_fault { faultcode => $args_from_ref->{ code } || 'soap:Client', faultactor => $args_from_ref->{ role } || 'urn:localhost', faultstring => $args_from_ref->{ message } || "Unknown error" - }); + }); } 1; @@ -61,11 +61,11 @@ Deserializer for creating perl hash refs as result of a SOAP call. =head2 Output structure -The XML structure is converted into a perl data structure consisting of +The XML structure is converted into a perl data structure consisting of hash and or list references. List references are used for holding array data. -SOAP::WSDL::Deserializer::Hash creates list references always at the maximum -depth possible. +SOAP::WSDL::Deserializer::Hash creates list references always at the maximum +depth possible. Examples: @@ -91,16 +91,16 @@ Examples: Perl: { MyDataArray => { - MyData => [ - { int => 1 }, + MyData => [ + { int => 1 }, { int => 1 } ] } } -List reference creation is triggered by the second occurance of an element. -XML Array types with one element only will not be represented as list -references. +List reference creation is triggered by the second occurance of an element. +XML Array types with one element only will not be represented as list +references. =head1 USAGE @@ -108,15 +108,15 @@ All you need to do is to use SOAP::WSDL::Deserializer::Hash. SOAP::WSDL::Deserializer::Hash autoregisters itself for SOAP1.1 messages -You may register SOAP::WSDLDeserializer::Hash for other SOAP Versions by +You may register SOAP::WSDLDeserializer::Hash for other SOAP Versions by calling - SOAP::Factory::Deserializer->register('1.2', + SOAP::Factory::Deserializer->register('1.2', SOAP::WSDL::Deserializer::Hash) =head1 Limitations -=over +=over =item * Namespaces @@ -134,17 +134,17 @@ All XML attributes are ignored. =item * generate_fault -SOAP::WSDL::Deserializer::Hash will die with a SOAP::WSDL::Fault11 object when +SOAP::WSDL::Deserializer::Hash will die with a SOAP::WSDL::Fault11 object when a parse error appears =back -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT Copyright 2004-2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under -the same terms as perl itself +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself. =head1 AUTHOR @@ -152,9 +152,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 176 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - $Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $ - $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ - + $Id: Hash.pm 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $ + =cut diff --git a/lib/SOAP/WSDL/Deserializer/SOM.pm b/lib/SOAP/WSDL/Deserializer/SOM.pm index d15256a..857978b 100644 --- a/lib/SOAP/WSDL/Deserializer/SOM.pm +++ b/lib/SOAP/WSDL/Deserializer/SOM.pm @@ -2,15 +2,15 @@ package SOAP::WSDL::Deserializer::SOM; use strict; use warnings; -our $VERSION = '2.00_15'; +our $VERSION = '2.00_24'; our @ISA; -eval { +eval { require SOAP::Lite; - push @ISA, 'SOAP::Deserializer'; + push @ISA, 'SOAP::Deserializer'; } -or die "Cannot load SOAP::Lite. -Cannot deserialize to SOM object without SOAP::Lite. +or die "Cannot load SOAP::Lite. +Cannot deserialize to SOM object without SOAP::Lite. Please install SOAP::Lite."; sub generate_fault { @@ -48,29 +48,27 @@ This package is here for two reasons: =item * Compatibility -You don't have to change the rest of your SOAP::Lite based app when switching -to SOAP::WSDL, but can just use SOAP::WSDL::Deserializer::SOM to get back the +You don't have to change the rest of your SOAP::Lite based app when switching +to SOAP::WSDL, but can just use SOAP::WSDL::Deserializer::SOM to get back the same objects as you were used to. =item * Completeness -SOAP::Lite covers much more of the SOAP specification than SOAP::WSDL. +SOAP::Lite covers much more of the SOAP specification than SOAP::WSDL. -SOAP::WSDL::Deserializer::SOM can be used for content which cannot be -deserialized by L. -This may be XML including mixed content, attachements and other XML data not -(yet) handled by L. +SOAP::WSDL::Deserializer::SOM can be used for content which cannot be +deserialized by L. +This may be XML including mixed content, attachements and other XML data not +(yet) handled by L. =back -SOAP::WSDL::Deserializer::SOM is a subclass of L -from the L package. - -You may +SOAP::WSDL::Deserializer::SOM is a subclass of L +from the L package. =head1 USAGE -SOAP::WSDL::Deserializer will not auroregister itself - to use it for a particular +SOAP::WSDL::Deserializer will not auroregister itself - to use it for a particular SOAP version just use the following lines: my $soap_version = '1.1'; # or '1.2', further versions may appear. @@ -87,7 +85,7 @@ SOAP version just use the following lines: =item * No on_fault handler -You cannot specify what to do when an error occurs - SOAP::WSDL will die +You cannot specify what to do when an error occurs - SOAP::WSDL will die with a SOAP::Fault object on transport errors. =back @@ -98,17 +96,17 @@ with a SOAP::Fault object on transport errors. =item * generate_fault -SOAP::WSDL::Deserializer::SOM will die with a SOAP::Fault object on calls +SOAP::WSDL::Deserializer::SOM will die with a SOAP::Fault object on calls to generate_fault. =back -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT Copyright 2004-2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under -the same terms as perl itself +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself. =head1 AUTHOR @@ -116,9 +114,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 176 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - $Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $ - $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ - + $Id: SOM.pm 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $ + =cut diff --git a/lib/SOAP/WSDL/Deserializer/XSD.pm b/lib/SOAP/WSDL/Deserializer/XSD.pm index 7648aa4..36cf50f 100644 --- a/lib/SOAP/WSDL/Deserializer/XSD.pm +++ b/lib/SOAP/WSDL/Deserializer/XSD.pm @@ -5,13 +5,13 @@ use Class::Std::Storable; use SOAP::WSDL::SOAP::Typelib::Fault11; use SOAP::WSDL::Expat::MessageParser; -our $VERSION='2.00_21'; +our $VERSION='2.00_24'; my %class_resolver_of :ATTR(:name :default<()>); sub BUILD { my ($self, $ident, $args_of_ref) = @_; - + # ignore all options except 'class_resolver' for (keys %{ $args_of_ref }) { delete $args_of_ref->{ $_ } if $_ ne 'class_resolver'; @@ -21,7 +21,7 @@ sub BUILD { sub deserialize { my ($self, $content) = @_; - + my $parser = SOAP::WSDL::Expat::MessageParser->new({ class_resolver => $class_resolver_of{ ident $self }, }); @@ -43,7 +43,64 @@ sub generate_fault { faultcode => $args_from_ref->{ code } || 'soap:Client', faultactor => $args_from_ref->{ role } || 'urn:localhost', faultstring => $args_from_ref->{ message } || "Unknown error" - }); + }); } -1; \ No newline at end of file +1; + +__END__ + +=head1 NAME + +SOAP::WSDL::Deserializer::XSD - Deserializer SOAP messages into SOAP::WSDL::XSD::Typelib:: objects + +=head1 DESCRIPTION + +Default deserializer for SOAP::WSDL::Client and interface classes generated by +SOAP::WSDL. Converts SOAP messages to SOAP::WSDL::XSD::Typlib:: based objects. + +Needs a class_resolver typemap either passed by the generated interface +or user-provided. + +SOAP::WSDL::Deserializer classes implement the API described in +L. + +=head1 USAGE + +Usually you don't need to do anything to use this package - it's the default +deserializer for SOAP::WSDL::Client and interface classes generated by +SOAP::WSDL. + +Is you want to use the XSD serializer from SOAP::WSDL, set the outputtree() +property and provide a class_resolver. + +=head1 METHODS + +=head2 deserialize + +Deserializes the message. + +=head2 generate_fault + +Generates a L +object and returns it. + +=head1 LICENSE AND COPYRIGHT + +Copyright 2004-2007 Martin Kutter. + +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself. + +=head1 AUTHOR + +Martin Kutter Emartin.kutter fen-net.deE + +=head1 REPOSITORY INFORMATION + + $Rev: 391 $ + $LastChangedBy: kutterma $ + $Id: XSD.pm 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $ + +=cut diff --git a/lib/SOAP/WSDL/Expat/Base.pm b/lib/SOAP/WSDL/Expat/Base.pm index 47df83b..45a5691 100644 --- a/lib/SOAP/WSDL/Expat/Base.pm +++ b/lib/SOAP/WSDL/Expat/Base.pm @@ -3,6 +3,8 @@ use strict; use warnings; use XML::Parser::Expat; +our $VERSION = '2.00_24'; + sub new { my ($class, $args) = @_; my $self = {}; @@ -11,21 +13,21 @@ sub new { } sub parse { - eval { + eval { $_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] ); $_[0]->{ parser }->release(); }; $_[0]->{ parser }->xpcroak( $@ ) if $@; - return $_[0]->{ data }; + return $_[0]->{ data }; } sub parsefile { - eval { - $_[0]->_initialize( XML::Parser::Expat->new(Namespaces => 1) )->parsefile( $_[1] ); + eval { + $_[0]->_initialize( XML::Parser::Expat->new(Namespaces => 1) )->parsefile( $_[1] ); $_[0]->{ parser }->release(); }; $_[0]->{ parser }->xpcroak( $@ ) if $@; - return $_[0]->{ data }; + return $_[0]->{ data }; } # SAX-like aliases diff --git a/lib/SOAP/WSDL/Expat/Message2Hash.pm b/lib/SOAP/WSDL/Expat/Message2Hash.pm index c8fcd1b..31db2d5 100644 --- a/lib/SOAP/WSDL/Expat/Message2Hash.pm +++ b/lib/SOAP/WSDL/Expat/Message2Hash.pm @@ -4,55 +4,57 @@ use strict; use warnings; use base qw(SOAP::WSDL::Expat::Base); +our $VERSION = '2.00_24'; + sub _initialize { my ($self, $parser) = @_; $self->{ parser } = $parser; - delete $self->{ data }; # remove potential old results - + delete $self->{ data }; # remove potential old results + my $characters; my $current = {}; my $list = []; # node list my $current_part = q{}; # are we in header or body ? $self->{ data } = $current; - + # use "globals" for speed - my ($_element, $_method, + my ($_element, $_method, $_class, $_parser, %_attrs) = (); - no strict qw(refs); + no strict qw(refs); $parser->setHandlers( Start => sub { push @$list, $current; - #If our element exists and is a list ref, add to it - if ( exists $current->{ $_[1] } - && ( ref ($current->{ $_[1] }) eq 'ARRAY') - ) { - push @{ $current->{ $_[1] } }, {}; - $current = $current->{ $_[1] }->[-1]; - } - elsif ( exists $current->{ $_[1] } ) - { + #If our element exists and is a list ref, add to it + if ( exists $current->{ $_[1] } + && ( ref ($current->{ $_[1] }) eq 'ARRAY') + ) { + push @{ $current->{ $_[1] } }, {}; + $current = $current->{ $_[1] }->[-1]; + } + elsif ( exists $current->{ $_[1] } ) + { $current->{ $_[1] } = [ $current->{ $_[1] }, {} ]; - $current = $current->{ $_[1] }->[-1]; - } + $current = $current->{ $_[1] }->[-1]; + } else { $current->{ $_[1] } = {}; $current = $current->{ $_[1] }; } return; }, - + Char => sub { $characters .= $_[1] if $_[1] !~m{ \A \s* \z}xms; return; }, - - End => sub { + + End => sub { $_element = $_[1]; # This one easily handles ignores for us, too... # return if not ref $$list[-1]; - + if (length $characters) { if (ref $list->[-1]->{ $_element } eq 'ARRAY') { $list->[-1]->{ $_element }->[-1] = $characters ; @@ -80,7 +82,7 @@ SOAP::WSDL::Expat::Message2Hash - Convert SOAP messages to perl hash refs =head1 SYNOPSIS my $parser = SOAP::WSDL::Expat::MessageParser->new({ - class_resolver => 'My::Resolver' + class_resolver => 'My::Resolver' }); $parser->parse( $xml ); my $obj = $parser->get_data(); diff --git a/lib/SOAP/WSDL/Expat/MessageParser.pm b/lib/SOAP/WSDL/Expat/MessageParser.pm index ba55b2f..f6f4f95 100644 --- a/lib/SOAP/WSDL/Expat/MessageParser.pm +++ b/lib/SOAP/WSDL/Expat/MessageParser.pm @@ -5,11 +5,13 @@ use warnings; use SOAP::WSDL::XSD::Typelib::Builtin; use base qw(SOAP::WSDL::Expat::Base); +our $VERSION = '2.00_24'; + sub new { my ($class, $args) = @_; my $self = { class_resolver => $args->{ class_resolver }, - strict => exists $args->{ strict } ? $args->{ strict } : 1, + strict => exists $args->{ strict } ? $args->{ strict } : 1, }; bless $self, $class; return $self; @@ -18,7 +20,7 @@ sub new { sub class_resolver { my $self = shift; $self->{ class_resolver } = shift if @_; - return $self->{ class_resolver }; + return $self->{ class_resolver }; } sub _initialize { @@ -27,30 +29,30 @@ sub _initialize { delete $self->{ data }; # remove potential old results delete $self->{ header }; - + my $characters; #my @characters_from = (); my $current = undef; my $list = []; # node list - my $path = []; # current path + my $path = []; # current path my $skip = 0; # skip elements my $current_part = q{}; # are we in header or body ? my $depth = 0; - my %content_check = $self->{strict} + my %content_check = $self->{strict} ? ( 0 => sub { die "Bad top node $_[1]" if $_[1] ne 'Envelope'; die "Bad namespace for SOAP envelope: " . $_[0]->recognized_string() if $_[0]->namespace($_[1]) ne 'http://schemas.xmlsoap.org/soap/envelope/'; $depth++; - return; + return; }, 1 => sub { $depth++; if ($_[1] eq 'Body') { - if (exists $self->{ data }) { # there was header data + if (exists $self->{ data }) { # there was header data $self->{ header } = $self->{ data }; delete $self->{ data }; $list = []; @@ -58,37 +60,37 @@ sub _initialize { undef $current; } } - return; + return; } - ) + ) : (); my $char_handler = sub { # push @characters_from, $_[1] if $_[1] =~m{ [^s] }xms; $characters .= $_[1] if $_[1] =~m{ [^\s] }xms; - + return; }; # use "globals" for speed - my ($_prefix, $_method, + my ($_prefix, $_method, $_class) = (); - no strict qw(refs); + no strict qw(refs); $parser->setHandlers( - Start => sub { + Start => sub { # my ($parser, $element, %_attrs) = @_; # $depth = $parser->depth(); # call methods without using their parameter stack # That's slightly faster than $content_check{ $depth }->() # and we don't have to pass $_[1] to the method. - # Yup, that's dirty. - return &{$content_check{ $depth }} if exists $content_check{ $depth }; + # Yup, that's dirty. + return &{$content_check{ $depth }} if exists $content_check{ $depth }; push @{ $path }, $_[1]; # step down in path return if $skip; # skip inside __SKIP__ - + # resolve class of this element $_class = $self->{ class_resolver }->get_class( $path ) or die "Cannot resolve class for " @@ -96,66 +98,65 @@ sub _initialize { if ($_class eq '__SKIP__') { $skip = join('/', @{ $path }); - $self->setHandlers( Char => undef ); + $_[0]->setHandlers( Char => undef ); return; - } - - push @$list, $current; # step down in tree ()remember current) - + } + + push @$list, $current; # step down in tree (remember current) + $characters = q(); # empty characters - #@characters_from = (); - + # Check whether we have a builtin - we implement them as classes # We could replace this with UNIVERSAL->isa() - but it's slow... - # match is a bit faster if the string does not match, but WAY slower - # if $class matches... - if (index $_class, 'SOAP::WSDL::XSD::Typelib::Builtin', 0 < 0) { + # match is a bit faster if the string does not match, but WAY slower + # if $class matches. We hope to match often... + if (index $_class, 'SOAP::WSDL::XSD::Typelib::Builtin', 0 < 0) { # check wheter there is a non-empty ARRAY reference for $_class::ISA # or a "new" method # If not, require it - all classes required here MUST # define new() - # This is not exactly the same as $class->can('new'), but it's way faster + # This is not exactly the same as $class->can('new'), but it's way faster defined *{ "$_class\::new" }{ CODE } or scalar @{ *{ "$_class\::ISA" }{ ARRAY } } or eval "require $_class" ## no critic qw(ProhibitStringyEval) - or die $@; + or die $@; } - + $current = $_class->new({ @_[2..$#_] }); # set new current object - + # remember top level element - exists $self->{ data } - or ($self->{ data } = $current); + exists $self->{ data } + or ($self->{ data } = $current); $depth++; return; }, - + Char => $char_handler, - + End => sub { pop @{ $path }; # step up in path - + if ($skip) { return if $skip ne join '/', @{ $path }, $_[1]; $skip = 0; - $_[0]->setHandler( Char => $char_handler ); + $_[0]->setHandlers( Char => $char_handler ); return; } $depth--; - + # This one easily handles ignores for us, too... return if not ref $list->[-1]; - + # set characters in current if we are a simple type # we may have characters in complexTypes with simpleContent, # too - maybe we should rely on the presence of characters ? - # may get a speedup by defining a ident method in anySimpleType + # may get a speedup by defining a ident method in anySimpleType # and looking it up via exists &$class::ident; # if ( $current->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType') ) { # $current->set_value( $characters ); # } - # currently doesn't work, as anyType does not implement value - + # currently doesn't work, as anyType does not implement value - # maybe change ? $current->set_value( $characters ) if (length $characters); #$current->set_value( join @characters_from ) if (@characters_from); @@ -166,7 +167,7 @@ sub _initialize { #$_method = "add_$_localname"; $_method = "add_$_[1]"; $list->[-1]->$_method( $current ); - + $current = pop @$list; # step up in object hierarchy... return; } @@ -174,7 +175,6 @@ sub _initialize { return $parser; } - sub get_header { return $_[0]->{ header }; } @@ -190,7 +190,7 @@ SOAP::WSDL::Expat::MessageParser - Convert SOAP messages to custom object trees =head1 SYNOPSIS my $parser = SOAP::WSDL::Expat::MessageParser->new({ - class_resolver => 'My::Resolver' + class_resolver => 'My::Resolver' }); $parser->parse( $xml ); my $obj = $parser->get_data(); @@ -205,8 +205,8 @@ See L for details. Sometimes there's unneccessary information transported in SOAP messages. -To skip XML nodes (including all child nodes), just edit the type map for -the message and set the type map entry to '__SKIP__'. +To skip XML nodes (including all child nodes), just edit the type map for +the message and set the type map entry to '__SKIP__'. =head1 Bugs and Limitations @@ -220,23 +220,22 @@ the message and set the type map entry to '__SKIP__'. =back +=head1 LICENSE AND COPYRIGHT + +Copyright 2004-2007 Martin Kutter. + +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself. + =head1 AUTHOR -Replace the whitespace by @ for E-Mail Address. +Martin Kutter Emartin.kutter fen-net.deE - Martin Kutter Emartin.kutter fen-net.deE +=head1 REPOSITORY INFORMATION -=head1 COPYING - -This module may be used under the same terms as perl itself. - -=head1 Repository information - - $ID: $ - - $LastChangedDate: 2007-10-07 19:27:58 +0200 (Son, 07 Okt 2007) $ - $LastChangedRevision: 313 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - + $Id: MessageParser.pm 391 2007-11-17 21:56:13Z kutterma $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $ +=cut \ No newline at end of file diff --git a/lib/SOAP/WSDL/Expat/MessageStreamParser.pm b/lib/SOAP/WSDL/Expat/MessageStreamParser.pm index 5fbddae..e7f8888 100644 --- a/lib/SOAP/WSDL/Expat/MessageStreamParser.pm +++ b/lib/SOAP/WSDL/Expat/MessageStreamParser.pm @@ -6,6 +6,8 @@ use XML::Parser::Expat; use SOAP::WSDL::Expat::MessageParser; use base qw(SOAP::WSDL::Expat::MessageParser); +our $VERSION = '2.00_24'; + sub parse_start { my $self = shift; $self->{ parser } = $_[0]->_initialize( XML::Parser::ExpatNB->new( Namespaces => 1 ) ); @@ -35,7 +37,7 @@ SOAP::WSDL::Expat::MessageStreamParser - Convert SOAP messages to custom object my $lwp = LWP::UserAgent->new(); my $parser = SOAP::WSDL::Expat::MessageParser->new({ - class_resolver => 'My::Resolver' + class_resolver => 'My::Resolver' }); my $chunk_parser = $parser->init(); # process response while it comes in, trying to read 32k chunks. @@ -54,23 +56,22 @@ See L for details. See SOAP::WSDL::Expat::MessageParser +=head1 LICENSE AND COPYRIGHT + +Copyright 2007 Martin Kutter. All rights reserved. + +This file is part of SOAP-WSDL. You may distribte/modify it under +the same terms as perl itself + =head1 AUTHOR -Replace the whitespace by @ for E-Mail Address. +Martin Kutter Emartin.kutter fen-net.deE - Martin Kutter Emartin.kutter fen-net.deE +=head1 REPOSITORY INFORMATION -=head1 COPYING - -This module may be used under the same terms as perl itself. - -=head1 Repository information - - $ID: $ - - $LastChangedDate: 2007-10-07 19:27:58 +0200 (Son, 07 Okt 2007) $ - $LastChangedRevision: 313 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - + $Id: MessageStreamParser.pm 391 2007-11-17 21:56:13Z kutterma $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $ - + +=cut diff --git a/lib/SOAP/WSDL/Expat/WSDLParser.pm b/lib/SOAP/WSDL/Expat/WSDLParser.pm index 6da46e1..4d172c0 100644 --- a/lib/SOAP/WSDL/Expat/WSDLParser.pm +++ b/lib/SOAP/WSDL/Expat/WSDLParser.pm @@ -11,12 +11,12 @@ sub _initialize { # init object data $self->{ parser } = $parser; delete $self->{ data }; - + # setup local variables for keeping temp data my $characters = undef; my $current = undef; my $list = []; # node list - + # TODO skip non-XML Schema namespace tags $parser->setHandlers( Start => sub { @@ -33,21 +33,21 @@ sub _initialize { if ($action->{ type } eq 'CLASS') { eval "require $action->{ class }"; croak $@ if ($@); - + my $obj = $action->{ class }->new({ parent => $current }) ->init( _fixup_attrs( $parser, %attrs ) ); - + if ($current) { # inherit namespace, but don't override $obj->set_targetNamespace( $current->get_targetNamespace() ) if not $obj->get_targetNamespace(); - + # push on parent's element/type list my $method = "push_$localname"; no strict qw(refs); $current->$method( $obj ); - + # remember element for stepping back push @{ $list }, $current; } @@ -62,7 +62,7 @@ sub _initialize { } elsif ($action->{ type } eq 'METHOD') { my $method = $action->{ method } || $localname; - + no strict qw(refs); # call method with # - default value ($action->{ value } if defined, @@ -74,26 +74,26 @@ sub _initialize { ? ref $action->{ value } ? @{ $action->{ value } } : ($action->{ value }) - : _fixup_attrs($parser, %attrs) + : _fixup_attrs($parser, %attrs) ); } - + return; }, - + Char => sub { $characters .= $_[1]; return; }, - - End => sub { + + End => sub { my ($parser, $localname) = @_; - + my $action = SOAP::WSDL::TypeLookup->lookup( $parser->namespace( $localname ), $localname ) || {}; - + return if not ($action->{ type }); - if ( $action->{ type } eq 'CLASS' ) { - $current = pop @{ $list }; + if ( $action->{ type } eq 'CLASS' ) { + $current = pop @{ $list }; } elsif ($action->{ type } eq 'CONTENT' ) { my $method = $action->{ method }; @@ -114,24 +114,24 @@ sub _initialize { # make attrs SAX style sub _fixup_attrs { my ($parser, %attrs_of) = @_; - - my @attrs_from = map { $_ = + + my @attrs_from = map { $_ = { - Name => $_, - Value => $attrs_of{ $_ }, - LocalName => $_ - } + Name => $_, + Value => $attrs_of{ $_ }, + LocalName => $_ + } } keys %attrs_of; - # add xmlns: attrs. expat eats them. - push @attrs_from, map { - # ignore xmlns=FOO namespaces - must be XML schema + # add xmlns: attrs. expat eats them. + push @attrs_from, map { + # ignore xmlns=FOO namespaces - must be XML schema # Other nodes should be ignored somewhere else ($_ eq '#default') - ? () + ? () : - { - Name => "xmlns:$_", + { + Name => "xmlns:$_", Value => $parser->expand_ns_prefix( $_ ), LocalName => $_ } diff --git a/lib/SOAP/WSDL/Factory/Deserializer.pm b/lib/SOAP/WSDL/Factory/Deserializer.pm index a5f835c..275d75a 100644 --- a/lib/SOAP/WSDL/Factory/Deserializer.pm +++ b/lib/SOAP/WSDL/Factory/Deserializer.pm @@ -2,6 +2,8 @@ package SOAP::WSDL::Factory::Deserializer; use strict; use warnings; +our $VERSION = '2.00_24'; + my %DESERIALIZER = ( '1.1' => 'SOAP::WSDL::Deserializer::XSD', ); @@ -20,7 +22,7 @@ sub get_deserializer { if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } }); # load module - eval "require $DESERIALIZER{ $args_of_ref->{ soap_version } }" + eval "require $DESERIALIZER{ $args_of_ref->{ soap_version } }" or die "Cannot load serializer $DESERIALIZER{ $args_of_ref->{ soap_version } }", $@; return $DESERIALIZER{ $args_of_ref->{ soap_version } }->new($args_of_ref); @@ -51,7 +53,7 @@ SOAP::WSDL::Factory::Deserializer - Factory for retrieving Deserializer objects =head1 DESCRIPTION -SOAP::WSDL::Factory::Deserializer serves as factory for retrieving +SOAP::WSDL::Factory::Deserializer serves as factory for retrieving deserializer objects for SOAP::WSDL. The actual work is done by specific deserializer classes. @@ -64,7 +66,7 @@ SOAP::WSDL::Deserializer tries to load one of the following classes: =back -By default, L +By default, L is registered for SOAP1.1 messages. =head1 METHODS @@ -85,25 +87,25 @@ Deserializer classes may register with SOAP::WSDL::Factory::Deserializer. =head2 Registering a deserializer -Registering a deserializer class with SOAP::WSDL::Factory::Deserializer -is done by executing the following code where $version is the SOAP version +Registering a deserializer class with SOAP::WSDL::Factory::Deserializer +is done by executing the following code where $version is the SOAP version the class should be used for, and $class is the class name. SOAP::WSDL::Factory::Deserializer->register( $version, $class); -To auto-register your transport class on loading, execute register() +To auto-register your transport class on loading, execute register() in your tranport class (see L above). =head2 Deserializer package layout -Deserializer modules must be named equal to the deserializer class they +Deserializer modules must be named equal to the deserializer class they contain. There can only be one deserializer class per deserializer module. =head2 Methods to implement Deserializer classes must implement the following methods: -=over +=over =item * new @@ -111,31 +113,31 @@ Constructor. =item * deserialize -Deserialize data from XML to arbitrary formats. +Deserialize data from XML to arbitrary formats. -deserialize() must return a fault indicating that deserializing failed if +deserialize() must return a fault indicating that deserializing failed if any error is encountered during the process of deserializing the XML message. The following positional parameters are passed to the deserialize method: - $content - the xml message + $content - the xml message =item * generate_fault -Generate a fault in the supported format. The following named parameters are +Generate a fault in the supported format. The following named parameters are passed as a single hash ref: code - The fault code, e.g. 'soap:Server' or the like - role - The fault role (actor in SOAP1.1) + role - The fault role (actor in SOAP1.1) message - The fault message (faultstring in SOAP1.1) =back -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -Copyright 2004-2007 Martin Kutter. +Copyright 2007 Martin Kutter. All rights reserved. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribte/modify it under the same terms as perl itself =head1 AUTHOR diff --git a/lib/SOAP/WSDL/Factory/Generator.pm b/lib/SOAP/WSDL/Factory/Generator.pm index eb64156..caff6af 100644 --- a/lib/SOAP/WSDL/Factory/Generator.pm +++ b/lib/SOAP/WSDL/Factory/Generator.pm @@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Generator; use strict; use warnings; -our $VERSION='2.00_18'; +our $VERSION='2.00_24'; my %GENERATOR = ( 'XSD' => 'SOAP::WSDL::Generator::Template::XSD', @@ -19,13 +19,13 @@ sub get_generator { # sanity check # die "no generator registered for generation method $args_of_ref->{ type }" -# - my $generator_class = (exists ($GENERATOR{ $args_of_ref->{ type } })) +# + my $generator_class = (exists ($GENERATOR{ $args_of_ref->{ type } })) ? $GENERATOR{ $args_of_ref->{ type } } : $args_of_ref->{ type }; # load module - eval "require $generator_class" + eval "require $generator_class" or die "Cannot load generator $generator_class", $@; return $generator_class->new(); @@ -55,7 +55,7 @@ SOAP::WSDL::Factory:Generator - Factory for retrieving generator objects =head1 DESCRIPTION -SOAP::WSDL::Factory::Generator serves as factory for retrieving +SOAP::WSDL::Factory::Generator serves as factory for retrieving generator objects for SOAP::WSDL. The actual work is done by specific generator classes. @@ -86,25 +86,25 @@ Returns an object of the generator class for this endpoint. Generator classes may register with SOAP::WSDL::Factory::Generator. -Registering a generator class with SOAP::WSDL::Factory::Generator is done -by executing the following code where $version is the SOAP version the +Registering a generator class with SOAP::WSDL::Factory::Generator is done +by executing the following code where $version is the SOAP version the class should be used for, and $class is the class name. SOAP::WSDL::Factory::Generator->register( $version, $class); -To auto-register your transport class on loading, execute register() in +To auto-register your transport class on loading, execute register() in your generator class (see L above). =head2 Generator package layout -Generator modules must be named equal to the generator class they contain. +Generator modules must be named equal to the generator class they contain. There can only be one generator class per generator module. =head2 Methods to implement Generator classes must implement the following methods: -=over +=over =item * new @@ -116,7 +116,7 @@ Generate SOAP interface =back -Generators may implements one or more of the following configuration +Generators may implements one or more of the following configuration methods. All of them are tried via can() by wsdl2perl. =over @@ -151,12 +151,12 @@ Set user-defined typemap snippet =back -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -Copyright (c) 2004-2007 Martin Kutter. +Copyright 2007 Martin Kutter. All rights reserved. -This file is part of SOAP-WSDL. You may distribute/modify it under the same -terms as perl itself +This file is part of SOAP-WSDL. You may distribte/modify it under +the same terms as perl itself =head1 AUTHOR @@ -164,9 +164,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 302 $ + $Rev: 176 $ $LastChangedBy: kutterma $ - $Id: Generator.pm 302 2007-09-30 19:25:25Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Generator.pm $ + $Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $ + $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ =cut diff --git a/lib/SOAP/WSDL/Factory/Serializer.pm b/lib/SOAP/WSDL/Factory/Serializer.pm index e16a815..82c7a2a 100644 --- a/lib/SOAP/WSDL/Factory/Serializer.pm +++ b/lib/SOAP/WSDL/Factory/Serializer.pm @@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Serializer; use strict; use warnings; -our $VERSION='2.00_17'; +our $VERSION='2.00_24'; my %SERIALIZER = ( '1.1' => 'SOAP::WSDL::Serializer::XSD', @@ -22,7 +22,7 @@ sub get_serializer { if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } }); # load module - eval "require $SERIALIZER{ $args_of_ref->{ soap_version } }" + eval "require $SERIALIZER{ $args_of_ref->{ soap_version } }" or die "Cannot load serializer $SERIALIZER{ $args_of_ref->{ soap_version } }", $@; return $SERIALIZER{ $args_of_ref->{ soap_version } }->new(); @@ -52,7 +52,7 @@ SOAP::WSDL::Factory::Serializer - Factory for retrieving serializer objects =head1 DESCRIPTION -SOAP::WSDL::Factory::Serializer serves as factory for retrieving +SOAP::WSDL::Factory::Serializer serves as factory for retrieving serializer objects for SOAP::WSDL. The actual work is done by specific serializer classes. @@ -83,30 +83,30 @@ Returns an object of the serializer class for this endpoint. Serializer classes may register with SOAP::WSDL::Factory::Serializer. -Serializer objects may also be passed directly to SOAP::WSDL::Client by -using the set_serializer method. Note that serializers objects set via -SOAP::WSDL::Client's set_serializer method are discarded when the SOAP +Serializer objects may also be passed directly to SOAP::WSDL::Client by +using the set_serializer method. Note that serializers objects set via +SOAP::WSDL::Client's set_serializer method are discarded when the SOAP version is changed via set_soap_version. -Registering a serializer class with SOAP::WSDL::Factory::Serializer is done -by executing the following code where $version is the SOAP version the +Registering a serializer class with SOAP::WSDL::Factory::Serializer is done +by executing the following code where $version is the SOAP version the class should be used for, and $class is the class name. SOAP::WSDL::Factory::Serializer->register( $version, $class); -To auto-register your transport class on loading, execute register() in +To auto-register your transport class on loading, execute register() in your tranport class (see L above). =head2 Serializer package layout -Serializer modules must be named equal to the serializer class they contain. +Serializer modules must be named equal to the serializer class they contain. There can only be one serializer class per serializer module. =head2 Methods to implement Serializer classes must implement the following methods: -=over +=over =item * new @@ -114,7 +114,7 @@ Constructor. =item * serialize -Serializes data to XML. The following named parameters are passed to the +Serializes data to XML. The following named parameters are passed to the serialize method in a anonymous hash ref: { @@ -125,12 +125,12 @@ serialize method in a anonymous hash ref: =back -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -Copyright 2004-2007 Martin Kutter. +Copyright 2004-2007 Martin Kutter. All rights reserved. -This file is part of SOAP-WSDL. You may distribute/modify it under -the same terms as perl itself +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself. =head1 AUTHOR @@ -138,9 +138,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 329 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - $Id: Serializer.pm 329 2007-10-18 19:42:09Z kutterma $ + $Id: Serializer.pm 391 2007-11-17 21:56:13Z kutterma $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ =cut diff --git a/lib/SOAP/WSDL/Factory/Transport.pm b/lib/SOAP/WSDL/Factory/Transport.pm index 78ecf58..48f27db 100644 --- a/lib/SOAP/WSDL/Factory/Transport.pm +++ b/lib/SOAP/WSDL/Factory/Transport.pm @@ -16,12 +16,12 @@ my %SOAP_LITE_TRANSPORT_OF = ( mailto => 'SOAP::Transport::MAILTO', 'local' => 'SOAP::Transport::LOCAL', jabber => 'SOAP::Transport::JABBER', - mq => 'SOAP::Transport::MQ', + mq => 'SOAP::Transport::MQ', ); my %SOAP_WSDL_TRANSPORT_OF = ( http => 'SOAP::WSDL::Transport::HTTP', - https => 'SOAP::WSDL::Transport::HTTP', + https => 'SOAP::WSDL::Transport::HTTP', ); # class methods only @@ -35,16 +35,16 @@ sub get_transport { my ($class, $scheme, %attrs) = @_; $scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx; - + if ($registered_transport_of{ $scheme }) { eval "require $registered_transport_of{ $scheme }" or die "Cannot load transport class $registered_transport_of{ $scheme } : $@"; - - # try "foo::Client" class first - SOAP::Tranport always requires + + # try "foo::Client" class first - SOAP::Tranport always requires # a package withoug the ::Client appended, and then # instantiates a ::Client object... # ... pretty weird ... - # ... must be from some time when the max number of files was a + # ... must be from some time when the max number of files was a # sparse resource ... # ... but we've decided to mimic SOAP::Lite... @@ -68,7 +68,7 @@ sub get_transport { } if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) { - eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }" + eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }" or die "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@"; return $SOAP_WSDL_TRANSPORT_OF{ $scheme }->new( %attrs ); } @@ -100,14 +100,14 @@ SOAP::WSDL::Factory::Transport - Factory for retrieving transport objects =head1 DESCRIPTION -SOAP::WSDL::Transport serves as factory for retrieving transport objects for +SOAP::WSDL::Transport serves as factory for retrieving transport objects for SOAP::WSDL. The actual work is done by specific transport classes. SOAP::WSDL::Transport tries to load one of the following classes: -=over +=over =item * the class registered for the scheme via register() @@ -129,7 +129,7 @@ Globally registers a class for use as transport class. $trans->proxy('http://soap-wsdl.sourceforge.net'); -Sets the proxy (endpoint). +Sets the proxy (endpoint). Returns the transport for this protocol. @@ -145,34 +145,34 @@ Gets the current transport object. =head2 Registering a transport class -Transport classes must be registered with SOAP::WSDL::Factory::Transport. +Transport classes must be registered with SOAP::WSDL::Factory::Transport. -This is done by executing the following code where $scheme is the URL scheme -the class should be used for, and $module is the class' module name. +This is done by executing the following code where $scheme is the URL scheme +the class should be used for, and $module is the class' module name. SOAP::WSDL::Factory::Transport->register( $scheme, $module); -To auto-register your transport class on loading, execute register() in your +To auto-register your transport class on loading, execute register() in your tranport class (see L above). -Multiple protocols ore multiple classes are registered by multiple calls to +Multiple protocols ore multiple classes are registered by multiple calls to register(). =head2 Transport plugin package layout -You may only use transport classes whose name is either +You may only use transport classes whose name is either the module name or the module name with '::Client' appended. =head2 Methods to implement -Transport classes must implement the interface required for SOAP::Lite -transport classes (see L for details, +Transport classes must implement the interface required for SOAP::Lite +transport classes (see L for details, L for an example). -To provide this interface, transport modules must implement the following +To provide this interface, transport modules must implement the following methods: -=over +=over =item * new @@ -198,12 +198,12 @@ Returns true after a send_receive was successful, false if it was not. =back -SOAP::Lite requires transport modules to pack client and server +SOAP::Lite requires transport modules to pack client and server classes in one file, and to follow this naming scheme: - Module name: + Module name: "SOAP::Transport::" . uc($scheme) - + Client class (additional package in module): "SOAP::Transport::" . uc($scheme) . "::Client" @@ -214,20 +214,20 @@ SOAP::WSDL does not require you to follow these restrictions. There is only one restriction in SOAP::WSDL: -You may only use transport classes whose name is either the module name or +You may only use transport classes whose name is either the module name or the module name with '::Client' appended. -SOAP::WSDL will try to instantiate an object of your transport class with +SOAP::WSDL will try to instantiate an object of your transport class with '::Client' appended to allow using transport classes written for SOAP::Lite. -This may lead to errors when a different module with the name of your +This may lead to errors when a different module with the name of your transport module suffixed with ::Client is also loaded. -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -Copyright 2004-2007 Martin Kutter. +Copyright 2004-2007 Martin Kutter. All rights reserved. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR @@ -236,9 +236,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 304 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - $Id: Transport.pm 304 2007-10-02 20:07:21Z kutterma $ + $Id: Transport.pm 391 2007-11-17 21:56:13Z kutterma $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $ =cut diff --git a/lib/SOAP/WSDL/Generator/Template.pm b/lib/SOAP/WSDL/Generator/Template.pm index d459d8e..478cb8f 100644 --- a/lib/SOAP/WSDL/Generator/Template.pm +++ b/lib/SOAP/WSDL/Generator/Template.pm @@ -23,15 +23,15 @@ sub START { sub _process :PROTECTED { my ($self, $template, $arg_ref, $output) = @_; my $ident = ident $self; - my $tt = $tt_of{$ident} ||= Template->new( + my $tt = $tt_of{$ident} ||= Template->new( DEBUG => 1, EVAL_PERL => $EVAL_PERL_of{ $ident }, RECURSION => $RECURSION_of{ $ident }, INCLUDE_PATH => $INCLUDE_PATH_of{ $ident }, OUTPUT_PATH => $OUTPUT_PATH_of{ $ident }, ); - $tt->process( $template, - { + $tt->process( $template, + { definitions => $self->get_definitions, interface_prefix => $self->get_interface_prefix, type_prefix => $self->get_type_prefix, @@ -40,10 +40,9 @@ sub _process :PROTECTED { element_prefix => $self->get_element_prefix, NO_POD => delete $arg_ref->{ NO_POD } ? 1 : 0 , %{ $arg_ref } - }, + }, $output) or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error(); - } 1; \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD.pm b/lib/SOAP/WSDL/Generator/Template/XSD.pm index b4f5ab1..7ebc725 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD.pm +++ b/lib/SOAP/WSDL/Generator/Template/XSD.pm @@ -18,23 +18,23 @@ sub BUILD { $self->set_RECURSION(1); $self->set_INCLUDE_PATH( exists $arg_ref->{INCLUDE_PATH} ? $arg_ref->{INCLUDE_PATH} - : do { - # ignore uninitialized warnings - File::Spec warns about + : do { + # ignore uninitialized warnings - File::Spec warns about # uninitialized values, probably because we have no filename local $SIG{__WARN__} = sub { return if ($_[0]=~m{\buninitialized\b}); CORE::warn @_; }; - + # makeup path for the OS we're running on - my ($volume, $dir, $file) = File::Spec->splitpath( + my ($volume, $dir, $file) = File::Spec->splitpath( File::Spec->rel2abs( dirname __FILE__ ) ); $dir = File::Spec->catdir($dir, $file, 'XSD'); # return path put together... my $path = File::Spec->catpath( $volume, $dir ); - - # Fixup path for windows - / works fine, \ does + + # Fixup path for windows - / works fine, \ does # not... if ( eval { &Win32::BuildNumber } ) { $path =~s{\\}{/}g; @@ -54,16 +54,13 @@ sub generate { sub generate_typelib { my ($self) = @_; - # $output_of{ ident $self } = ""; - my @schema = @{ $self->get_definitions()->first_types()->get_schema() }; for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) { $type->_accept( $self ); } - # return $output_of{ ident $self }; - + return; } sub generate_interface { @@ -72,23 +69,23 @@ sub generate_interface { my $arg_ref = shift; my $tt = $self->get_tt(); for my $service (@{ $self->get_definitions->get_service }) { - for my $port (@{ $service->get_port() }) { + for my $port (@{ $service->get_port() }) { # Skip ports without (known) address next if not $port->first_address; next if not $port->first_address->isa('SOAP::WSDL::SOAP::Address'); my $port_name = $port->get_name; $port_name =~s{ \A .+\. }{}xms; - my $output = $arg_ref->{ output } - ? $arg_ref->{ output } - : $self->_generate_filename( - $self->get_interface_prefix(), - $service->get_name(), + my $output = $arg_ref->{ output } + ? $arg_ref->{ output } + : $self->_generate_filename( + $self->get_interface_prefix(), + $service->get_name(), $port_name, - ); + ); print "Creating interface class $output\n"; - - $self->_process('Interface.tt', + + $self->_process('Interface.tt', { service => $service, port => $port, @@ -101,7 +98,6 @@ sub generate_interface { sub generate_typemap { my ($self, $arg_ref) = @_; - my $visitor = SOAP::WSDL::Generator::Visitor::Typemap->new({ type_prefix => $self->get_type_prefix(), element_prefix => $self->get_element_prefix(), @@ -112,17 +108,16 @@ sub generate_typemap { 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', 'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', - %{ $typemap_of{ident $self }}, + %{ $typemap_of{ident $self }}, } }); for my $service (@{ $self->get_definitions->get_service }) { $visitor->visit_Service( $service ); - my $output = $arg_ref->{ output } - ? $arg_ref->{ output } - : $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() ); - + my $output = $arg_ref->{ output } + ? $arg_ref->{ output } + : $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() ); print "Creating typemap class $output\n"; - $self->_process('Typemap.tt', + $self->_process('Typemap.tt', { service => $service, typemap => $visitor->get_typemap(), @@ -142,7 +137,7 @@ sub _generate_filename :PRIVATE { sub visit_XSD_Element { my ($self, $element) = @_; - my $output = defined $output_of{ ident $self } + my $output = defined $output_of{ ident $self } ? $output_of{ ident $self } : $self->_generate_filename( $self->get_element_prefix(), $element->get_name() ); $self->_process('element.tt', { element => $element } , $output); @@ -150,7 +145,7 @@ sub visit_XSD_Element { sub visit_XSD_SimpleType { my ($self, $type) = @_; - my $output = defined $output_of{ ident $self } + my $output = defined $output_of{ ident $self } ? $output_of{ ident $self } : $self->_generate_filename( $self->get_type_prefix(), $type->get_name() ); $self->_process('simpleType.tt', { simpleType => $type } , $output); @@ -158,7 +153,7 @@ sub visit_XSD_SimpleType { sub visit_XSD_ComplexType { my ($self, $type) = @_; - my $output = defined $output_of{ ident $self } + my $output = defined $output_of{ ident $self } ? $output_of{ ident $self } : $self->_generate_filename( $self->get_type_prefix(), $type->get_name() ); $self->_process('complexType.tt', { complexType => $type } , $output); diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt index 8e440a2..dbd835a 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt @@ -2,11 +2,12 @@ package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% p use strict; use warnings; use Class::Std::Storable; +use Scalar::Util qw(blessed); use base qw(SOAP::WSDL::Client::Base); # only load if it hasn't been loaded before require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %] - if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class'); + if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class'); sub START { $_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy}; @@ -18,6 +19,7 @@ sub START { FOREACH operation = binding.get_operation; %][% INCLUDE Interface/Operation.tt %] [% + END; %] @@ -32,11 +34,22 @@ __END__ =head1 NAME -[% interface_prefix %]::[% service.get_name %]::[% port.get_name %] - SOAP Interface for the [% service.get_name %] Web Service +[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Interface for the [% service.get_name %] Web Service + +=head1 SYNOPSIS + + use [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]; + my $interface = [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new(); + + my $response; +[% FOREACH operation = binding.get_operation; +%] $response = $interface->[% operation.get_name %](); +[% END %] + =head1 DESCRIPTION -SOAP Interface for the [% service.get_name %] web service +SOAP Interface for the [% service.get_name %] web service located at [% port.first_address.get_location %]. =head1 SERVICE [% service.get_name %] @@ -64,7 +77,7 @@ All arguments are forwarded to L. [% FOREACH operation = binding.get_operation; %][% INCLUDE Interface/POD/Operation.tt %] -[% END %] +[% END %] =head1 AUTHOR diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt index cc59cfa..70f7bf6 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt @@ -11,54 +11,53 @@ my $element_prefix = $stash->{ element_prefix }; my @body_part_from = split m{\s}, $item->get_parts; - - my @parts; - if (@body_part_from) { - @parts = map { - my $part = $_; - (grep { - my ($ns, $lname) = $def->expand( $_ ); - ($lname eq $part->get_name) - } @body_part_from - ) - ? do { - my $name; - ($name = $part->get_element) - ? do { - $name =~s{ ^[^:]+: }{}xms; - $element_prefix . '::' . $name; - } - : ($name = $part->get_type) - ? do { - $name =~s{ ^[^:]+: }{}xms; - $type_prefix . '::' . $name; - } - : die "input must have either type or element" - } - : () - } @{ $part_from }; - } - else { - @parts = map { - my $part = $_; - my $name; - ($name = $part->get_element) - ? do { - $name =~s{ ^[^:]+: }{}xms; - "$element_prefix\::$name" - } - : ($name = $part->get_type) - ? do { - $name =~s{ ^[^:]+: }{}xms; - "$type_prefix\::$name" - } - : die "input must have either type or element"; - } @{ $part_from }; + + my @parts; + if (@body_part_from) { + @parts = map { + my $part = $_; + (grep { + my ($ns, $lname) = $def->expand( $_ ); + ($lname eq $part->get_name) + } @body_part_from + ) + ? do { + my $name; + ($name = $part->get_element) + ? do { + $name =~s{ ^[^:]+: }{}xms; + $element_prefix . '::' . $name; + } + : ($name = $part->get_type) + ? do { + $name =~s{ ^[^:]+: }{}xms; + $type_prefix . '::' . $name; + } + : die "input must have either type or element" + } + : () + } @{ $part_from }; + } + else { + @parts = map { + my $part = $_; + my $name; + ($name = $part->get_element) + ? do { + $name =~s{ ^[^:]+: }{}xms; + "$element_prefix\::$name" + } + : ($name = $part->get_type) + ? do { + $name =~s{ ^[^:]+: }{}xms; + "$type_prefix\::$name" + } + : die "input must have either type or element"; + } @{ $part_from }; } $stash->{ parts } = \@parts; - - [% END; - %] + +[% END %] 'use' => '[% item.get_use %]', namespace => '[% item.get_namespace %]', encodingStyle => '[% item.get_encodingStyle %]', diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Header.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Header.tt index 8744601..ff643d1 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Header.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Header.tt @@ -1,8 +1,8 @@ [% RETURN IF NOT item; message_name = item.get_message; - IF NOT message_name; - THROW BAD_WSDL "missing attribute in header for operation ${operation.get_name}"; + IF NOT message_name; + THROW BAD_WSDL "missing attribute in header for operation ${operation.get_name}"; END; message = definitions.find_message( item.expand( message_name ) ); PERL %] @@ -13,22 +13,22 @@ my $element_prefix = $stash->{ element_prefix }; my ($ns, $lname) = $def->expand( $item->get_part() ); my ($part) = grep { - $_->get_name eq $lname - && $_->get_targetNamespace eq $ns } @{ $message->get_part( ) }; + $_->get_name eq $lname + && $_->get_targetNamespace eq $ns } @{ $message->get_part( ) }; my $part_class = do { - my $name; - ($name = $part->get_element) - ? do { - $name =~s{ ^[^:]+: }{}xms; - $element_prefix . '::' . $name; - } - : ($name = $part->get_type) - ? do { - $name =~s{ ^[^:]+: }{}xms; - $type_prefix . '::' . $name; - } - : die "input must have either type or element" - }; + my $name; + ($name = $part->get_element) + ? do { + $name =~s{ ^[^:]+: }{}xms; + $element_prefix . '::' . $name; + } + : ($name = $part->get_type) + ? do { + $name =~s{ ^[^:]+: }{}xms; + $type_prefix . '::' . $name; + } + : die "input must have either type or element" + }; $stash->{ part_class } = $part_class; [% END; %] diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Operation.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Operation.tt index 89954fe..7a380e2 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Operation.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/Operation.tt @@ -1,10 +1,11 @@ sub [% operation.get_name %] { my ($self, $body, $header) = @_; + die "[% operation.get_name %] must be called as object method (\$self is <$self>)" if not blessed($self); return $self->SUPER::call({ - operation => '[% operation.get_name %]', + operation => '[% operation.get_name %]', soap_action => '[% operation.first_operation.get_soapAction %]', style => '[% operation.get_style || binding.get_style %]', - body => { + body => { [% INCLUDE Interface/Body.tt( item = operation.first_input.first_body ); %] }, header => { diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Element.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Element.tt index 14c127d..7072d06 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Element.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Element.tt @@ -1,13 +1,13 @@ [% INDENT; %][% element.get_name %] => [%- - IF (element.get_ref); - element = element.get_ref(); - END; - IF (type_name = element.get_type); + IF (element.get_ref); + element = element.get_ref(); + END; + IF (type_name = element.get_type); INCLUDE Interface/POD/Type.tt(type = definitions.first_types.find_type( element.expand(type_name) ) ); ELSIF (type = element.first_complexType); INCLUDE Interface/POD/Type.tt(type = type ); ELSIF (type = element.first_simpleType); INCLUDE Interface/POD/Type.tt(type = type ); - END; + END; %] \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Message.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Message.tt index 6f181e8..bb7efe0 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Message.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Message.tt @@ -1,9 +1,9 @@ [% message_name = port_op.first_input.get_message(); - # message_name; + # message_name; part_from = definitions.find_message( port_op.first_input.expand( message_name ) ).get_part; FOREACH part = part_from; - INCLUDE Interface/POD/Part.tt(part = part); + INCLUDE Interface/POD/Part.tt(part = part); END; %] \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt index 12d43d5..a2c56f2 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt @@ -1,7 +1,7 @@ [% element = definitions.first_types.find_element( part.expand( part.get_element ) ); - #element.get_name(); - #element; - #STOP; - type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type( - element.expand( element.get_type ) ); - INCLUDE Interface/POD/Type.tt;%], + #element.get_name(); + #element; + #STOP; + type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type( + element.expand( element.get_type ) ); + INCLUDE Interface/POD/Type.tt;%], diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt index fb2b8bc..9bbec73 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt @@ -1,7 +1,7 @@ [%- indent = ' '; IF type.isa('SOAP::WSDL::XSD::ComplexType'); - INCLUDE complexType/POD/structure.tt(complexType = type); + INCLUDE complexType/POD/structure.tt(complexType = type); ELSE; - INCLUDE simpleType/POD/structure.tt(simpleType = type); + INCLUDE simpleType/POD/structure.tt(simpleType = type); END; indent.replace('\s{2}$',''); %] \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/method_info.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/method_info.tt index a080b5d..b4d1993 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/method_info.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/method_info.tt @@ -1,7 +1,7 @@ -Method synopsis is displayed with hash refs as parameters. +Method synopsis is displayed with hash refs as parameters. -The commented class names in the method's parameters denote that objects +The commented class names in the method's parameters denote that objects of the corresponding class can be passed instead of the marked hash ref. -You may pass any combination of objects, hash and list refs to these +You may pass any combination of objects, hash and list refs to these methods, as long as you meet the structure. diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt index 442a44a..7d35836 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt @@ -4,7 +4,7 @@ use warnings; our [% USE Dumper(varname = 'typemap_'); Dumper.dump( typemap ) %]; -sub get_class { +sub get_class { my $name = join '/', @{ $_[1] }; exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__; return $typemap_1->{ $name }; diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt b/lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt index dea5511..f4118c2 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt @@ -1,6 +1,6 @@ -[% type_name = node.expand( type ); - IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%] +[% type_name = node.expand( type ); + IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%] SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %] -[% ELSE -%] -[% type_prefix %]::[% type_name.1 %] -[% END -%] \ No newline at end of file +[% ELSE -%] +[% type_prefix %]::[% type_name.1 %] +[% END -%] \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt index 859d3d5..c4074d8 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt @@ -2,8 +2,8 @@ package [% type_prefix %]::[% complexType.get_name %]; use strict; use warnings; [% INCLUDE complexType/contentModel.tt %] -[%# -# Don't include any perl source here - there may be sub-packages... +[%# +# Don't include any perl source here - there may be sub-packages... #-%] 1; @@ -21,7 +21,7 @@ Perl data type class for the XML Schema defined complextype =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: [% FOREACH element = complexType.get_element -%] diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt index bd8da26..daa2c1c 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt @@ -1,9 +1,9 @@ [% IF (complexType.get_variety == 'restriction'); - INCLUDE complexType/POD/restriction.tt(complexType = complexType); + INCLUDE complexType/POD/restriction.tt(complexType = complexType); ELSIF (complexType.get_variety == 'sequence'); - THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet"; + THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet"; ELSE; - THROW UNKNOWN, "unknown variety ${ complexType.get_variety }"; + THROW UNKNOWN, "unknown variety ${ complexType.get_variety }"; END; %] \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt index 756c49a..dd94421 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt @@ -1,13 +1,13 @@ [% IF (complexType.get_variety == 'all'); - INCLUDE complexType/POD/all.tt(complexType = complexType); + INCLUDE complexType/POD/all.tt(complexType = complexType); ELSIF (complexType.get_variety == 'sequence'); - INCLUDE complexType/POD/all.tt(complexType = complexType); + INCLUDE complexType/POD/all.tt(complexType = complexType); ELSIF (complexType.get_variety == 'group'); - THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType group not implemented yet"; + THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType group not implemented yet"; ELSIF (complexType.get_variety == 'choice'); - INCLUDE complexType/POD/choice.tt(complexType = complexType); + INCLUDE complexType/POD/choice.tt(complexType = complexType); ELSIF (complexType.get_contentModel == 'simpleContent'); - THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet"; + THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet"; ELSIF (complexType.get_contentModel == 'complexContent'); - INCLUDE complexType/POD/complexContent.tt(complexType = complexType); -END %] \ No newline at end of file + INCLUDE complexType/POD/complexContent.tt(complexType = complexType); +END %], \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt index 8b5bc65..8ddae94 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt @@ -2,8 +2,8 @@ use Class::Std::Storable; use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); { # BLOCK to scope variables -[% -atomic_types = []; +[% +atomic_types = {}; FOREACH element = complexType.get_element %] my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>); @@ -14,30 +14,30 @@ __PACKAGE__->_factory( [% element.get_name -%] [% END %] ) ], - { + { [% FOREACH element = complexType.get_element -%] - [% element.get_name %] => \%[% element.get_name %]_of, -[% END -%] + [% element.get_name %] => \%[% element.get_name %]_of, +[% END -%] }, { [% FOREACH element = complexType.get_element; - IF (type = element.get_type); - element_type = complexType.expand( type ); - IF (element_type.0 == 'http://www.w3.org/2001/XMLSchema'); -%] + IF (type = element.get_type); + element_type = complexType.expand( type ); + IF (element_type.0 == 'http://www.w3.org/2001/XMLSchema'); -%] [% 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); - atomic_types.push( element.first_simpleType ); - ELSIF (element.first_simpleType); - atomic_types.push( element.first_simpleType ); - ELSE; - THROW NOT_IMPLEMENTED , "atomic types in complexType elements not supported yet"; - END; %] - [% element.get_name %] => '[% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]', -[% END; +[% END; + ELSE; + IF (element.first_simpleType); + atomic_types.${ element.get_name } = element.first_simpleType; + ELSIF (element.first_complexType); + atomic_types.${ element.get_name } = element.first_complexType; + ELSE; + THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type - don't know what to do with it"; + END; %] + [% element.get_name %] => '[% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]', +[% END; END -%] } ); diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt index 0bbc15b..c11113a 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt @@ -1,17 +1,17 @@ -[% FOREACH type = atomic_types; %] +[% FOREACH type IN atomic_types; %] -package [% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]; +package [% type_prefix %]::[% complexType.get_name %]::_[% type.key %]; use strict; use warnings; { -[% IF ( type.isa('SOAP::WSDL::XSD::ComplexType') ); - INCLUDE complexType/contentModel.tt(complexType = type ); -ELSIF ( type.isa('SOAP::WSDL::XSD::SimpleType') ); - INCLUDE simpleType/contentModel.tt(simpleType = type ); -ELSE; - PERL; %] die $stash->{ type }->_DUMP [% END; - THROW UNKNOWN, "neither complex nor simple type - don't know what to do"; +[% IF ( type.value.isa('SOAP::WSDL::XSD::ComplexType') ); + INCLUDE complexType/contentModel.tt(complexType = type.value ); +ELSIF ( type.value.isa('SOAP::WSDL::XSD::SimpleType') ); + INCLUDE simpleType/contentModel.tt(simpleType = type.value ); +ELSE; + PERL; %] die $stash->{ type } [% END; + THROW UNKNOWN, "neither complex nor simple type - don't know what to do"; END %] } diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt index 2ca8c2e..f7411b4 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt @@ -1,8 +1,8 @@ [% IF (complexType.get_variety == 'restriction'); - INCLUDE complexType/restriction.tt(complexType = complexType); + INCLUDE complexType/restriction.tt(complexType = complexType); ELSIF (complexType.get_variety == 'sequence'); - INCLUDE complexType/extension.tt(complexType = complexType); + INCLUDE complexType/extension.tt(complexType = complexType); ELSE; - THROW UNKNOWN, "unknown variety ${ complexType.get_variety }"; + THROW UNKNOWN, "unknown variety ${ complexType.get_variety }"; END; %] \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt index b38d459..8ccd840 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt @@ -1,7 +1,7 @@ [% IF (complexType.get_contentModel == 'simpleContent'); - THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet"; + THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet"; ELSIF (complexType.get_contentModel == 'complexContent'); - INCLUDE complexType/complexContent.tt(complexType = complexType); + INCLUDE complexType/complexContent.tt(complexType = complexType); ELSE; - INCLUDE complexType/variety.tt(complexType = complexType); + INCLUDE complexType/variety.tt(complexType = complexType); END %] diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt index 45fc3b8..3f48111 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt @@ -9,14 +9,14 @@ element_from = complexType.get_element; # Sanity check: All original elements must be noted first # FOREACH element = base_type.get_element; - IF element_from.${ loop.index }.get_name != element.get_name; - THROW WSDL "${element.get_name} not found at position ${ loop.index } in extension type ${ complexType.get_name }"; - END; + IF element_from.${ loop.index }.get_name != element.get_name; + THROW WSDL "${element.get_name} not found at position ${ loop.index } in extension type ${ complexType.get_name }"; + END; END; -%] -use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]); +use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]); [% INCLUDE complexType/variety.tt(complexType = complexType); diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt index fd3edcc..e33d45f 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt @@ -1,8 +1,8 @@ [% 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([% type_prefix %]::[% base_name.1.replace('\.', '::') %]); +[% ELSE; - THROW NOT_IMPLEMENTED, "restriction without base not supported"; + THROW NOT_IMPLEMENTED, "restriction without base not supported"; END %] \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt index 81022a8..ffed7e3 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt @@ -1,15 +1,15 @@ [% IF (complexType.get_variety == 'all'); - INCLUDE complexType/all.tt(complexType = complexType); + INCLUDE complexType/all.tt(complexType = complexType); ELSIF (complexType.get_variety == 'sequence'); - INCLUDE complexType/all.tt(complexType = complexType); + INCLUDE complexType/all.tt(complexType = complexType); ELSIF (complexType.get_variety == 'group'); - THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType group not implemented yet"; + THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType group not implemented yet"; ELSIF (complexType.get_variety == 'choice'); - INCLUDE complexType/all.tt(complexType = complexType); + INCLUDE complexType/all.tt(complexType = complexType); 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; - # There's no variety - might be empty complexType + # There's no variety - might be empty complexType END; %] \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/element.tt b/lib/SOAP/WSDL/Generator/Template/XSD/element.tt index 258a723..9d5282b 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/element.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/element.tt @@ -14,26 +14,26 @@ __PACKAGE__->__set_ref([% IF element.get_ref; %]'[% element.get_ref %]'[% END %] [%- IF (type = element.get_type); -%] use base qw( - SOAP::WSDL::XSD::Typelib::Element - [% INCLUDE _type_class.tt( type = type, node = element ) %] + SOAP::WSDL::XSD::Typelib::Element + [% INCLUDE _type_class.tt( type = type, node = element ) %] ); [%- ELSIF (ref = element.get_ref); -%] # element ref="[% ref %]" use base qw( - [% element_prefix %]::[% ref.split(':').1 %] + [% element_prefix %]::[% ref.split(':').1 %] ); [%- ELSIF (simpleType = element.first_simpleType) %] -# atomic simpleType: {simpleType}._DUMP [% END; - THROW UNKNOWN , "No list itemTape and no atomic simpleType - don't know what to do"; + THROW UNKNOWN , "No list itemTape and no atomic simpleType - don't know what to do"; END %] diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt b/lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt index 725e165..33d4360 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt @@ -1,9 +1,9 @@ # derivation by restriction [% IF (base = simpleType.get_base) -%] use base qw( - [% INCLUDE _type_class.tt(type = base, node=simpleType) %]); + [% INCLUDE _type_class.tt(type = base, node=simpleType) %]); [% ELSIF (type = simpleType.first_simpleType() ); - INCLUDE simpleType/atomicType.tt(type = type); + INCLUDE simpleType/atomicType.tt(type = type); ELSE; - THROW "neither base nor atomic type - don't know what to do" %] + THROW "neither base nor atomic type - don't know what to do" %] [% END %] \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Visitor.pm b/lib/SOAP/WSDL/Generator/Visitor.pm index fd76f0d..46e2862 100644 --- a/lib/SOAP/WSDL/Generator/Visitor.pm +++ b/lib/SOAP/WSDL/Generator/Visitor.pm @@ -11,9 +11,9 @@ my %element_prefix_of :ATTR(:name :default<()>); sub START { my ($self, $ident, $arg_ref) = @_; - $type_prefix_of{ $ident } = 'MyType' if not exists + $type_prefix_of{ $ident } = 'MyType' if not exists $arg_ref->{ 'type_prefix' }; - $element_prefix_of{ $ident } = 'MyElement' if not exists + $element_prefix_of{ $ident } = 'MyElement' if not exists $arg_ref->{ 'element_prefix' }; } @@ -48,53 +48,53 @@ SOAP::WSDL::Generator::Visitor - SOAP::WSDL's Visitor-based Code Generator =head1 DESCRIPTION -SOAP::WSDL featores a code generating facility. This code generation facility -(in fact there are several of them) is implemented as Visitor to +SOAP::WSDL featores a code generating facility. This code generation facility +(in fact there are several of them) is implemented as Visitor to SOAP::WSDL::Base-derived objects. =head2 The Visitor Pattern -The Visitor design pattern is one of the object oriented design pattern +The Visitor design pattern is one of the object oriented design pattern described by [GHJV1995]. -A Visitor is an object implementing some behaviour for a fixed set of classes, -whose implementation would otherwise need to be scattered accross those +A Visitor is an object implementing some behaviour for a fixed set of classes, +whose implementation would otherwise need to be scattered accross those classes' implementations. -Visitors are usually combined with Iterators for traversing either a list or +Visitors are usually combined with Iterators for traversing either a list or tree of objects. -A Visitor's methods are called using the so-called double dispatch technique. -To allow double dispatching, the Visitor implements one method for every class -ro be handled, whereas every class implements just one method (commonly named -"access"), which does nothing more than calling a method on the reference +A Visitor's methods are called using the so-called double dispatch technique. +To allow double dispatching, the Visitor implements one method for every class +ro be handled, whereas every class implements just one method (commonly named +"access"), which does nothing more than calling a method on the reference given, with the self object as parameter. -If all this sounds strange, maybe an example helps. Imagine you had a list of -person objects and wanted to print out a list of their names (or address -stamps or everything elseyou like). This can easily be implemented with a -Visitor: +If all this sounds strange, maybe an example helps. Imagine you had a list of +person objects and wanted to print out a list of their names (or address +stamps or everything elseyou like). This can easily be implemented with a +Visitor: package PersonVisitor; use Class::Std; # handles all basic stuff like constructors etc. - + sub visit_Person { my ( $self, $object ) = @_; print "Person name is ", $object->get_name(), "\n"; } - + package Person; use Class::Std; my %name : ATTR(:name :default); - + sub accept { $_[1]->visit_Person( $_[0] ) } - + package main; my @person_from = (); for (qw(Gamma Helm Johnson Vlissides)) { push @person_from, Person->new( { name => $_ } ); } - + my $visitor = PersonVisitor->new(); for (@person_from) { $_->accept($visitor); @@ -106,8 +106,8 @@ Visitor: Person name is Johnson Person name is Vlissides -While using this pattern for just printing a list may look a bit over-sized, -but it may become handy if you need multiple output formats and different +While using this pattern for just printing a list may look a bit over-sized, +but it may become handy if you need multiple output formats and different classes to operate on. The main benefits using visitors are: @@ -116,19 +116,19 @@ The main benefits using visitors are: =item * Grouping related behaviour in one class -Related behaviour for several classes can be grouped together in the Visitor -class. The behaviour can easily be changed by changing the code in one class, +Related behaviour for several classes can be grouped together in the Visitor +class. The behaviour can easily be changed by changing the code in one class, instead of having to change all the visited classes. =item * Cleaning up the data classes' implementations -If classes holding data also implement several different output formats or +If classes holding data also implement several different output formats or other (otherwise unrelated) behaviour, they tend to get bloated. -=item * Adding behaviour is easy +=item * Adding behaviour is easy -Swapping out the visitor class allows easy alterations of behaviour. So on a -list of Persons, one Visitor may print address stamps, while another one prints +Swapping out the visitor class allows easy alterations of behaviour. So on a +list of Persons, one Visitor may print address stamps, while another one prints out a phone number list. =back @@ -139,19 +139,19 @@ Of course, there are also drawbacks in the visitor pattern: =item * Changes in the visited classes are expensive -If one of the visited classes changes (or is added), all visitors must be -updated to reflect this change. This may be rather expensive if classes change +If one of the visited classes changes (or is added), all visitors must be +updated to reflect this change. This may be rather expensive if classes change often. =item * The visited classes must expose all data required -Visitors may need to use the internals of a class. This may result in fidelling +Visitors may need to use the internals of a class. This may result in fidelling with a object's internals, or a bloated interface in the visited class. =back -Visitors are usually accompanied by a Iterator. The Iterator may be implemented -in the visited classes, in the Visitor, or somewhere else (in the example it +Visitors are usually accompanied by a Iterator. The Iterator may be implemented +in the visited classes, in the Visitor, or somewhere else (in the example it was somewhere else). The Iterator decides which object to visit next. @@ -164,47 +164,47 @@ Code generation in SOAP::WSDL means generating various artefacts: =item * Typemaps -For every WSDL definition, a Typemap is created. The Typemap is used later as +For every WSDL definition, a Typemap is created. The Typemap is used later as an aid in parsing the SOAP XML messages. =item * Type Classes -For every type defined in the WSDL's schema, a Type Class is generated. +For every type defined in the WSDL's schema, a Type Class is generated. These classes are instantiated later as a result of parsing SOAP XML messages. =item * Interface Classes -For every service, a interface class is generated. This class is later used by +For every service, a interface class is generated. This class is later used by programmers accessing the service =item * Documentation -Both Type Classes and Interface Classes include documentation. Additional -documentation may be generated as a hint for programmers, or later for +Both Type Classes and Interface Classes include documentation. Additional +documentation may be generated as a hint for programmers, or later for mimicing .NET's .asmx example pages. =back -All these behaviours could well (and has historically been) implemented in the -classes holding the WSDL data. This made these classes rather bloated, and -made it hard to change behaviour (like, supporting SOAP Headers, -supporting atomic types and other features which were missing from early +All these behaviours could well (and has historically been) implemented in the +classes holding the WSDL data. This made these classes rather bloated, and +made it hard to change behaviour (like, supporting SOAP Headers, +supporting atomic types and other features which were missing from early versions of SOAP::WSDL). -Implementing these behaviours in Visitor classes eases adding new behaviours, -and reducing the incompletenesses still inherent in SOAP::WSDL's WSDL and XML +Implementing these behaviours in Visitor classes eases adding new behaviours, +and reducing the incompletenesses still inherent in SOAP::WSDL's WSDL and XML schema implementation. =head2 Implementation -=head3 accept +=head3 accept -SOAP::WSDL::Base defines an accept method which expects a Visitor as only +SOAP::WSDL::Base defines an accept method which expects a Visitor as only parameter. -The method visit_Foo_Bar is called on the visitor, whith the self object as -parameter. +The method visit_Foo_Bar is called on the visitor, whith the self object as +parameter. The actual method name is constructed this way: @@ -218,18 +218,18 @@ The actual method name is constructed this way: Example: -When visiting a SOAP::WSDL::XSD::ComplexType object, the method +When visiting a SOAP::WSDL::XSD::ComplexType object, the method visit_XSD_ComplexType is called on the visitor. =head2 Writing your own visitor -SOAP::WSDL eases writing your own visitor. This might be required if you need -some special output format from a WSDL file, or want to feed your own -serializer/deserializer pair with custom configuration data. Or maybe you want +SOAP::WSDL eases writing your own visitor. This might be required if you need +some special output format from a WSDL file, or want to feed your own +serializer/deserializer pair with custom configuration data. Or maybe you want to generate C# code from it... -To write your own code generating visitor, you should subclass -SOAP::WSDL::Generator::Visitor. It implements (empty) default methods for all +To write your own code generating visitor, you should subclass +SOAP::WSDL::Generator::Visitor. It implements (empty) default methods for all SOAP::WSDL data classes: =over @@ -264,16 +264,16 @@ SOAP::WSDL data classes: =item * visit_XSD_SimpleType -=back +=back -In your Visitor, you must implement visit_Foo methods for all classes you wish +In your Visitor, you must implement visit_Foo methods for all classes you wish to visit. -Currently, all SOAP::WSDL::Generator::Visitor implementations include their own -Iterator (which means they know how to find the next objects to visit). You -may or may not choose to implement a separate Iterator. +Currently, all SOAP::WSDL::Generator::Visitor implementations include their own +Iterator (which means they know how to find the next objects to visit). You +may or may not choose to implement a separate Iterator. -Letting a visitor implementing it's own Iterator visit a WSDL definition is as +Letting a visitor implementing it's own Iterator visit a WSDL definition is as easy as writing something like this: my $visitor = MyVisitor->new(); @@ -284,21 +284,21 @@ easy as writing something like this: =head1 REFERENCES -=over +=over -=item * [GHJV1995] +=item * [GHJV1995] -Erich Gamma, Richard Helm, Ralph E. Johnson, John Vlissides, (1995): +Erich Gamma, Richard Helm, Ralph E. Johnson, John Vlissides, (1995): Design Patterns. Elements of Reusable Object-Oriented Software. Addison-Wesley Longman, Amsterdam. -=back +=back -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT Copyright 2004-2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR diff --git a/lib/SOAP/WSDL/Generator/Visitor/Typemap.pm b/lib/SOAP/WSDL/Generator/Visitor/Typemap.pm index f1d4cdd..24d7085 100644 --- a/lib/SOAP/WSDL/Generator/Visitor/Typemap.pm +++ b/lib/SOAP/WSDL/Generator/Visitor/Typemap.pm @@ -18,32 +18,32 @@ sub START { sub set_typemap_entry { my ($self, $value) = @_; - $typemap_of{ ident $self }->{ - join( q{/}, @{ $path_of{ ident $self } } ) - } = $value; + $typemap_of{ ident $self }->{ + join( q{/}, @{ $path_of{ ident $self } } ) + } = $value; } sub add_element_path { my ($self, $element) = @_; - # Swapping out this lines against the ones below generates + # Swapping out this lines against the ones below generates # a namespace-sensitive typemap. - # Well almost: Class names are not constructed in a namespace-sensitive + # Well almost: Class names are not constructed in a namespace-sensitive # manner, yet - there should be some facility to allow binding a (perl) # prefix to a namespace... push @{ $path_of{ ident $self } }, $element->get_name(); - - # push @{ $path_of{ ident $self } }, - # "{". $element->get_targetNamespace . "}" + + # push @{ $path_of{ ident $self } }, + # "{". $element->get_targetNamespace . "}" # . $element->get_name(); -} +} sub visit_Definitions { my ( $self, $ident, $definitions ) = ( $_[0], ident $_[0], $_[1] ); - $self->set_definitions( $definitions ); + $self->set_definitions( $definitions ); - for ( @{ $definitions->get_service() } ) { + for ( @{ $definitions->get_service() } ){ $_->_accept($self); } } @@ -81,7 +81,7 @@ sub visit_Binding { my $name = $operation->get_name(); # get the equally named operation from the portType - my ($op) = grep { $_->get_name eq $name } + my ($op) = grep { $_->get_name eq $name } @{ $portType->get_operation() } or die "operation <$name> not found"; @@ -122,14 +122,14 @@ sub visit_Part { # FIXME support RPC-style calls die "unsupported global type <$type_name> found in part"; } - + # TODO factor out iterator or replace by lookup (probably better) if ( my $element_name = $part->get_element() ) { - my $element = $types_ref->find_element( + my $element = $types_ref->find_element( $part->expand($element_name) ) || die "no element $element_name found for part " . $part->get_name(); $element->_accept($self); - return; + return; } warn 'neither type nor element - do not know what to do for part ' @@ -160,9 +160,9 @@ sub process_referenced_type { } sub process_atomic_type { - my ( $self, $type, $callback ) = @_; + my ( $self, $type, $callback ) = @_; return if not $type; - + my $ident = ident $self; $callback->( $self, $type ) if $callback; return $self; @@ -171,40 +171,40 @@ sub process_atomic_type { sub visit_XSD_Element { my ( $self, $ident, $element ) = ( $_[0], ident $_[0], $_[1] ); - # TODO: what about element ref="" ? + # TODO: what about element ref="" ? # when we're hopping from one element to the next one... # step down in tree $self->add_element_path( $element ); # now call all possible variants. - # They all just return if no argument is given, + # They all just return if no argument is given, # and return $self on success. SWITCH: { - if ($element->get_type) { - $self->process_referenced_type( $element->expand( $element->get_type() ) ) + if ($element->get_type) { + $self->process_referenced_type( $element->expand( $element->get_type() ) ) && last; } # for atomic simple and comples types , and ref elements my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name(); - + $self->set_typemap_entry($typeclass); - + # kind of double-dispatch: returns true on success, but does nothing $self->process_atomic_type( $element->first_simpleType() ) && last; - + $self->process_atomic_type( $element->first_complexType() , sub { $_[1]->_accept($_[0]) } ) && last; - - # TODO: add element ref handling + + # TODO: add element ref handling }; # step up in hierarchy pop @{ $path_of{$ident} }; } -sub visit_XSD_ComplexType { +sub visit_XSD_ComplexType { my ($self, $ident, $type) = ($_[0], ident $_[0], $_[1] ); my $content_model = $type->get_flavor(); # TODO is this allowed ? or should we better die ? @@ -218,9 +218,9 @@ sub visit_XSD_ComplexType { } return; } - + warn "unsupported content model $content_model found in " - . "complex type " . $type->get_name() + . "complex type " . $type->get_name() . " - typemap may be incomplete"; } diff --git a/lib/SOAP/WSDL/Manual.pod b/lib/SOAP/WSDL/Manual.pod index 6afa108..7825e9b 100644 --- a/lib/SOAP/WSDL/Manual.pod +++ b/lib/SOAP/WSDL/Manual.pod @@ -12,12 +12,12 @@ SOAP::WSDL::Manual - Accessing WSDL based web services =item * Create WSDL bindings - perl wsdl2perl.pl -b base_dir URL + perl wsdl2perl.pl -b base_dir URL =item * Look what has been generated -Check the results of the generator. There should be one -MyInterfaces/SERVICE_NAME/PORT_NAME.pm file per port (and one directory per +Check the results of the generator. There should be one +MyInterfaces/SERVICE_NAME/PORT_NAME.pm file per port (and one directory per service). =item * Write script @@ -30,14 +30,14 @@ service). print $result; -C should give you some overview +C should give you some overview about the service's interface structure. -The results of all calls to your service object's methods (except new) are +The results of all calls to your service object's methods (except new) are objects based on SOAP::WSDL's XML schema implementation. -To access the object's properties use get_NAME / set_NAME getter/setter -methods whith NAME corresponding to the XML tag name / the hash structure as +To access the object's properties use get_NAME / set_NAME getter/setter +methods whith NAME corresponding to the XML tag name / the hash structure as showed in the generated pod. =item * Run script @@ -46,61 +46,61 @@ showed in the generated pod. =head2 Instrumenting web services with interface classes -SOAP::WSDL (starting from 2.00) instruments WSDL based web services with -interface classes. This means that SOAP::WSDL features a code generator +SOAP::WSDL (starting from 2.00) instruments WSDL based web services with +interface classes. This means that SOAP::WSDL features a code generator which creates one class for every web service you want to access. -Moreover, the data types from the WSDL definitions are also wrapped into -classes and returned to the user as objects. +Moreover, the data types from the WSDL definitions are also wrapped into +classes and returned to the user as objects. -To find out which class a particular XML node should be, SOAP::WSDL uses +To find out which class a particular XML node should be, SOAP::WSDL uses typemaps. For every Web service, there's also a typemap created. =head2 Interface class creation -To create interface classes, follow the steps above from +To create interface classes, follow the steps above from L. If this works fine for you, skip the next paragraphs. If not, read on. -The steps to instrument a web service with SOAP::WSDL perl bindings +The steps to instrument a web service with SOAP::WSDL perl bindings (in detail) are as follows: =over =item * Gather web service information -You'll need to know at least a URL pointing to the web service's WSDL +You'll need to know at least a URL pointing to the web service's WSDL definition. -If you already know more - like which methods the service provides, or how -the XML messages look like, that's fine. All these things will help you +If you already know more - like which methods the service provides, or how +the XML messages look like, that's fine. All these things will help you later. =item * Create WSDL bindings - perl wsdl2perl.pl -b base_dir URL + perl wsdl2perl.pl -b base_dir URL This will generate the perl bindings in the directory specified by base_dir. -For more options, see L - you may want to specify class -prefixes for XML type and element classes, type maps and interface classes, +For more options, see L - you may want to specify class +prefixes for XML type and element classes, type maps and interface classes, and you may even want to add custom typemap elements. =item * Check the result -There should be a bunch of classes for types (in the MyTypes:: namespace by -default), elements (in MyElements::), and at least one typemap (in +There should be a bunch of classes for types (in the MyTypes:: namespace by +default), elements (in MyElements::), and at least one typemap (in MyTypemaps::) and one ore more interface classes (in MyInterfaces::). -If you don't already know the details of the web service you're going to -instrument, it's now time to read the perldoc of the generated interface -classes. It will tell you what methods each service provides, and which +If you don't already know the details of the web service you're going to +instrument, it's now time to read the perldoc of the generated interface +classes. It will tell you what methods each service provides, and which parameters they take. -If the WSDL definition is informative about what these methods do, the +If the WSDL definition is informative about what these methods do, the included perldoc will be, too - if not, blame the web service author. - + =item * Write a perl script (or module) accessing the web service. use MyInterface::SERVICE_NAME; @@ -110,24 +110,24 @@ included perldoc will be, too - if not, blame the web service author. die $result if not $result; print $result; -The above handling of errors ("die $result if not $result") may look a bit -strange - it is due to the nature of -L +The above handling of errors ("die $result if not $result") may look a bit +strange - it is due to the nature of +L objects SOAP::WSDL uses for signalling failure. -These objects are false in boolean context, but serialize to their XML +These objects are false in boolean context, but serialize to their XML structure on stringification. -You may, of course, access individual fault properties, too. To get a list of +You may, of course, access individual fault properties, too. To get a list of fault properties, see L =back =head2 Adding missing information -Sometimes, WSDL definitions are incomplete. In most of these cases, proper -fault definitions are missing. This means that though the specification sais -nothing about it, Fault messages include extra elements in the +Sometimes, WSDL definitions are incomplete. In most of these cases, proper +fault definitions are missing. This means that though the specification says +nothing about it, Fault messages include extra elements in the EdetailE section, or errors are even indicated by non-fault messages. There are two steps you need to perform for adding additional information. @@ -136,38 +136,38 @@ There are two steps you need to perform for adding additional information. =item * Provide required type classes -For each extra data type used in the XML messages, a type class has to be -created. +For each extra data type used in the XML messages, a type class has to be +created. -It is strongly discouraged to use the same namespace for hand-written and -generated classes - while generated classes may be many, you probably will -only implement a few by hand. These (precious) few classes may get lost in -the mass of (cheap) generated ones. Just imagine one of your co-workers (or -even yourself) deleting the whole bunch and re-generating everything - oops +It is strongly discouraged to use the same namespace for hand-written and +generated classes - while generated classes may be many, you probably will +only implement a few by hand. These (precious) few classes may get lost in +the mass of (cheap) generated ones. Just imagine one of your co-workers (or +even yourself) deleting the whole bunch and re-generating everything - oops - almost everything. You got the point. -For simplicity, you probably just want to use builtin types wherever possible -- you are probably not interested in whether a fault detail's error code is -presented to you as a simpleType ranging from 1 to 10 (which you have to -write) or as a int (which is a builtin type ready to use). +For simplicity, you probably just want to use builtin types wherever possible +- you are probably not interested in whether a fault detail's error code is +presented to you as a simpleType ranging from 1 to 10 (which you have to +write) or as a int (which is a builtin type ready to use). -Using builtin types for simpleType definitions may greatly reduce the number +Using builtin types for simpleType definitions may greatly reduce the number of additional classes you need to implement. -If the extra type classes you need include EcomplexType E or -Eelement /E definitions, see L -and L on how to create ComplexType and +If the extra type classes you need include EcomplexType E or +Eelement /E definitions, see L +and L on how to create ComplexType and Element type classes. =item * Provide a typemap snippet to wsdl2perl.pl -SOAP::WSDL uses typemaps for finding out into which class' object a XML node +SOAP::WSDL uses typemaps for finding out into which class' object a XML node should be transformed. -Typemaps basically map the path of every XML element inside the Body tag to a +Typemaps basically map the path of every XML element inside the Body tag to a perl class. -Typemap snippets have to look like this (which is actually the default Fault +Typemap snippets have to look like this (which is actually the default Fault typemap included in every generated one): ( @@ -178,11 +178,11 @@ typemap included in every generated one): 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType', ); -The lines are hash key - value pairs. The keys are the XPath expressions -without occurence numbers (like [1]) relative to the Body element. -Namespaces are ignored. +The lines are hash key - value pairs. The keys are the XPath expressions +without occurence numbers (like [1]) relative to the Body element. +Namespaces are ignored. -If you don't know about XPath: They are just the names of the XML tags, +If you don't know about XPath: They are just the names of the XML tags, starting from the one inside EBodyE up to the current one joined by /. One line for every XML node is required. @@ -191,46 +191,45 @@ You may use all builtin, generated or custom type class names as values. Use wsdl2perl.pl -mi=FILE to include custom typemap snippets. -Note that typemap include files for wsdl2perl.pl must evaluate to a valid -perl hash - it will be imported via eval (OK, to be honest: via I, +Note that typemap include files for wsdl2perl.pl must evaluate to a valid +perl hash - it will be imported via eval (OK, to be honest: via I, but that's almost the same...). -Your extra statements are included last, so they override potential typemap +Your extra statements are included last, so they override potential typemap statements with the same keys. =back =head1 Accessing a web service without a WSDL definition - -Accessing a web service without a WSDL definition is more cumbersome. There -are two ways to go: + +Accessing a web service without a WSDL definition is more cumbersome. There +are two ways to go: =over - -=item * Write a WSDL definition and generate interface - -This is the way to go if you already are experienced in writing WSDL files. -If you are not, be warned: Writing a correct WSDL is not an easy task, and -writing correct WSDL files with only a text editor is almost impossible. - -You should definitely use a WSDL editor. The WSDL editor should support -conformance checks for the WS-I Basic Profile (1.0 is preferred by -SOAP::WSDL) - -=item * Write a typemap and class library from scratch - -If the web service is relatively simple, this is probably easier than first -writing a WSDL definition. Besides, it can be done in perl, a language you -are probably more familiar with than WSDL. - -L, L and -L tell you how to create subclasses of XML schema -types. - -L will tell you how to create a typemap class. + +=item * Write a WSDL definition and generate interface + +This is the way to go if you already are experienced in writing WSDL files. +If you are not, be warned: Writing a correct WSDL is not an easy task, and +writing correct WSDL files with only a text editor is almost impossible. +You should definitely use a WSDL editor. The WSDL editor should support +conformance checks for the WS-I Basic Profile (1.0 is preferred by +SOAP::WSDL) + +=item * Write a typemap and class library from scratch + +If the web service is relatively simple, this is probably easier than first +writing a WSDL definition. Besides, it can be done in perl, a language you +are probably more familiar with than WSDL. + +L, L and +L tell you how to create subclasses of XML schema +types. + +L will tell you how to create a typemap class. =back - + =head1 Troubleshooting =head2 Accessing HTTPS webservices @@ -239,40 +238,40 @@ You need Crypt::SSLeay installed to access HTTPS webservices. =head2 Accessing protected web services -Passing a userndame and password, or a client certificate and key, to the +Passing a userndame and password, or a client certificate and key, to the transport layer is highly dependent on the transport backend. =head3 Accessing HTTP(S) webservices with basic/digest authentication -When using SOAP::WSDL::Transport::HTTP (SOAP::Lite not installed), add a +When using SOAP::WSDL::Transport::HTTP (SOAP::Lite not installed), add a method called "get_basic_credentials" to SOAP::WSDL::Transport::HTTP: *SOAP::WSDL::Transport::HTTP::get_basic_credentials = sub { - return ($user, $password); + return ($user, $password); }; -When using SOAP::Transport::HTTP (SOAP::Lite is installed), do the same to +When using SOAP::Transport::HTTP (SOAP::Lite is installed), do the same to this backend: *SOAP::Transport::HTTP::get_basic_credentials = sub { - return ($user, $password); + return ($user, $password); }; =head3 Accessing HTTP(S) webservices protected by NTLM authentication -Besides passing user credentials as when accessing a web service protected -by basic or digest authentication, you also need to enforce connection +Besides passing user credentials as when accessing a web service protected +by basic or digest authentication, you also need to enforce connection keep_alive on the transport backens. -To do so, pass a I argument to the new() method of the generated +To do so, pass a I argument to the new() method of the generated class. This unfortunately means that you have to set the endpoint URL, too: my $interface = MyInterfaces::SERVICE_NAME::PORT_NAME->new({ proxy => [ $url, keep_alive => 1 ] }); -You may, of course, decide to just hack the generated class. Be advised that -subclassing might be a more appropriate solution - re-generating overwrites +You may, of course, decide to just hack the generated class. Be advised that +subclassing might be a more appropriate solution - re-generating overwrites changes in interface classes. =head3 Accessing HTTPS webservices protected by certificate authentication @@ -283,17 +282,19 @@ See L on how to configure client certificate authentication. =head1 SEE ALSO +L SOAP::WSDL's XML Schema implementation + L The meaning of all these words L Basic client for SOAP::WSDL based interfaces L an interpreting WSDL based SOAP client -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT Copyright 2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR diff --git a/lib/SOAP/WSDL/Manual/Deserializer.pod b/lib/SOAP/WSDL/Manual/Deserializer.pod new file mode 100644 index 0000000..bc0e8a9 --- /dev/null +++ b/lib/SOAP/WSDL/Manual/Deserializer.pod @@ -0,0 +1,49 @@ +=pod + +=head1 NAME + +SOAP::WSDL::Manual::Deserializer + +=head1 DESERIALIZER CLASSES + +Deserializer classes convert SOAP messages to perl data structures. + +SOAP::WSDL comes with several builtin serializer classes: + +=over + +=item * L + +Creates SOAP::WSDL::XSD objects from SOAP messages. Default deserializer for +generated interfaces and SOAP::WSDL::Client. + +=item * L + +Creates perl hash structures from SOAP messages. + +=item * L + +Creates SOAP::SOM objects from SOAP messages. Default deserializer for +SOAP::WSDL. + +See L for more information on SOAP::SOM objects. + +=back + +=head1 WRITING YOUR OWN DESERIALIZER + +See L. + +=head1 LICENSE AND COPYRIGHT + +Copyright 2007 Martin Kutter. + +This file is part of SOAP-WSDL. You may distribute/modify it under the same +terms as perl itself + +=head1 AUTHOR + +Martin Kutter Emartin.kutter fen-net.deE + +=cut + \ No newline at end of file diff --git a/lib/SOAP/WSDL/Manual/Glossary.pod b/lib/SOAP/WSDL/Manual/Glossary.pod index fade55c..0a88b23 100644 --- a/lib/SOAP/WSDL/Manual/Glossary.pod +++ b/lib/SOAP/WSDL/Manual/Glossary.pod @@ -6,55 +6,56 @@ SOAP::WSDL::Manual::Glossary - Those acronyms and stuff =head2 web service -Web services are RPC (Remote Procedure Call) interfaces accessible via -some internet protocol, typically via HTTP(S). +Web services are RPC (Remote Procedure Call) interfaces accessible via +some internet protocol, typically via HTTP(S). =head2 SOAP -SOAP is an acronym for Simple Object Access Protocol. -SOAP is a W3C recommendation. The latest version of the SOAP -specification may be found at L. +SOAP is (was - since 1.2 the name "SOAP" has no meaning any more) an acronym +for Simple Object Access Protocol. +SOAP is a W3C recommendation. The latest version of the SOAP specification +may be found at L. -SOAP defines a protocoll for message exchange between applications. +SOAP defines a protocoll for message exchange between applications. The most popular usage is to use SOAP for remote procedure calls (RPC). -While one of the constituting aspects of a web service is its -reachability via some internet protocol, you might as well define +While one of the constituting aspects of a web service is its +reachability via some internet protocol, you might as well define SOAP services accessible via postcards. -Despite it's name, SOAP has nothing more to do with objects than -cars have with pets - SOAP messages may, but not neccessarily do -carry objects, very much like your car may, but does not need to +Despite it's former name, SOAP has nothing more to do with objects than +cars have with pets - SOAP messages may, but not necessarily do +carry objects, very much like your car may, but does not need to carry your pet. =head2 WSDL -WSDL is an acronym for Web Services Description Language. -WSDL is a W3C recommendation. The latest version of the WSDL specification -may be found at L. +WSDL is an acronym for Web Services Description Language. +WSDL is a W3C recommendation. The latest version of the WSDL specification +may be found at L. -WSDL defines a XML-based language for describing web service interfaces, +WSDL defines a XML-based language for describing web service interfaces, including SOAP interfaces. =head2 WS-I -WS-I (Web Services Interoperability Organization) is an open industry -organisation chartered to promote Web service interoperability across +WS-I (Web Services Interoperability Organization) is an open industry +organisation chartered to promote Web service interoperability across platforms, operating systems, and programming languages. -WS-I publishes profiles, which provide implementation guidelines for -how related Web services specifications should be used together for -best interoperability. To date, WS-I has finalized the Basic Profile, -Attachments Profile and Simple SOAP Binding Profile. +WS-I publishes profiles, which provide implementation guidelines for +how related Web services specifications should be used together for +best interoperability. To date, WS-I has finalized the Basic Profile, +Attachments Profile and Simple SOAP Binding Profile. -SOAP::WSDL aims at complying to the Basic Profile (but does not +SOAP::WSDL aims at complying to the WS-I Basic Profile (but does not implement full support yet). =head2 SOAP message styles =head3 rpc -Meant for transporting a RPC message. All contents of the SOAP body are +Meant for transporting a RPC message. All contents of the SOAP body are put into a top-level node named equal to the SOAP operation. WS-I Basic Profile allows the use of rpc message style. @@ -65,7 +66,7 @@ SOAP::Lite supports rpc message style only. =head3 document -Meant for transporting arbitrary content. No additional nodes are inserted +Meant for transporting arbitrary content. No additional nodes are inserted between the SOAP body and the actual content. WS-I Basic Profile allows the use of document message style. @@ -76,16 +77,23 @@ WS-I Basic Profile allows the use of document message style. =head3 literal -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT Copyright 2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under -the same terms as perl itself +This file is part of SOAP-WSDL. You may distribute/modify it under the same +terms as perl itself. =head1 AUTHOR Martin Kutter Emartin.kutter fen-net.deE +=head1 REPOSITORY INFORMATION + + $Rev: 391 $ + $LastChangedBy: kutterma $ + $Id: Glossary.pod 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Glossary.pod $ + =cut diff --git a/lib/SOAP/WSDL/Manual/Parser.pod b/lib/SOAP/WSDL/Manual/Parser.pod index 5a2c612..82b8915 100644 --- a/lib/SOAP/WSDL/Manual/Parser.pod +++ b/lib/SOAP/WSDL/Manual/Parser.pod @@ -6,7 +6,7 @@ SOAP::WSDL::Manual::Parser - How SOAP::WSDL parses XML messages =head1 Which XML message does SOAP::WSDL parse ? -Naturally, there are two kinds of XML documents (or messages) SOAP::WSDL has +Naturally, there are two kinds of XML documents (or messages) SOAP::WSDL has to parse: =over @@ -17,77 +17,38 @@ to parse: =back -=head1 Parser implementations - -There are different parser implementations available for SOAP messages and +There are different parser implementations available for SOAP messages and WSDL definitions. -Historically, SOAP::WSDL used SAX for parsing XML. The SAX handlers were -implemented as L handlers, which also worked with -L. +=head1 WSDL definitions parser -Support for SAX and L in SOAP::WSDL is discontinued -for the following reasons: - -=over - -=item * Speed - -L is faster than -L - at least when optimized for speed. - -High parsing speed is one of the key requirements for a SOAP toolkit - if XML -serializing and (more important) deserializing are not fast enough, the whole -toolkit is unusable. - -=item * Availability - -L is more popular than L. - -=item * Stability - -XML::LibXML is based on the libxml2 library. Several versions of -libxml2 are known to have specific bugs. As a workaround, there are -often several versions of libxml2 installed on one system. This may -lead to problems on operating systems which cannot load more than -one version of a shared library simultaneously. - -XML::LibXML is also still under development, while XML::Parser has had time -to stabilize. - -=item * SOAP::Lite uses XML::Parser - -L uses L if available. -SOAP::WSDL should not require users to install both L -and L. - -=back - -=head2 WSDL definitions parser - -=over - -=item * SOAP::WSDL::Expat::WSDLParser +=head2 SOAP::WSDL::Expat::WSDLParser A parser for WSDL definitions based on L. my $parser = SOAP::WSDL::Expat::WSDLParser->new(); my $wsdl = $parser->parse_file( $filename ); -=back +The WSDL parser creates a tree of perl objects, whose root is a +L element. -=head2 SOAP messages parser +=head1 SOAP messages parser -All SOAP message handler use class resolvers for finding out which class +=head2 SOAP::WSDL::Expat::MessageParser + +L converts +SOAP messages to SOAP::WSDL::XSD object trees. + +It uses a class resolvers for finding out which class a particular XML element should be of, and type libs containing these classes. =head3 Creating a class resolver The easiest way for creating a class resolver is to run SOAP::WSDL's generator. -See wsdl2perl.pl +See L. -The class resolver must implement a class method "get_class", which is passed +The class resolver must implement a class method "get_class", which is passed a list ref of the current element's XPath (relative to Body), split by /. This method must return a class name appropriate for a XML element. @@ -116,10 +77,10 @@ A class resolver package might look like this: Sometimes there's unneccessary information transported in SOAP messages. -To skip XML nodes (including all child nodes), just edit the type map for -the message and set the type map entry to '__SKIP__'. +To skip XML nodes (including all child nodes), just edit the type map for +the message and set the type map entry to '__SKIP__'. -In the example above, EnqueueMessage/StuffIDontNeed and all child elements +In the example above, EnqueueMessage/StuffIDontNeed and all child elements are skipped. my %class_list = ( @@ -132,7 +93,7 @@ are skipped. 'EnqueueMessage/StuffIDontNeed/Bar' => 'SOAP::WSDL::XSD::Builtin::string', ); -Note that only SOAP::WSDL::Expat::MessageParser implements skipping elements +Note that only SOAP::WSDL::Expat::MessageParser implements skipping elements at the time of writing. =head3 Creating type lib classes @@ -141,81 +102,87 @@ Every element must have a correspondent one in the type library. Builtin types should be resolved as SOAP::WSDL::XSD::Builtin::* classes -Creating a type lib is easy: Just run SOAP::WSDL's generator - it will +Creating a type lib is easy: Just run SOAP::WSDL's generator - it will create both a typemap and the type lib classes for a WSDL file. -Sometimes it is nessecary to create type lib classes by hand - not all +Sometimes it is nessecary to create type lib classes by hand - not all WSDL definitions are complete. For writing your own lib classes, see L, L and L. -=head3 Parser implementations +=head2 SOAP::WSDL::Expat::Message2Hash + +Transforms a SOAP message into a perl hash refs. Using this parser is usually +triggered by calling the C method of SOAP::WSDL, or by using +L. + +Acts somewhat like XML::Simple, but faster. + +The following restrictions apply: =over -=item * SOAP::WSDL::Expat::MessageParser +=item * Ignores all namespaces -A L based parser. This is the fastest -parser for most SOAP messages and the default for SOAP::WSDL::Client. +=item * Ignores all attributes -=item * SOAP::WSDL::Expat::MessageStreamParser +=item * Does not handle mixed content -A XML::Parser::ExpatNB based parser. Useful for parsing huge HTTP responses, -as you don't need to keep everything in memory. - -See L -for details. +=item * The SOAP header is ignored =back -=head3 Performance - -SOAP::WSDL::Expat::MessageParser is the fastest way of parsing SOAP messages -into object trees and only slightly slower than converting them into hash -data structures: - - Parsing a SOAP message with a length of 5962 bytes: - SOAP::WSDL::Expat::MessageParser: - 3 wallclock secs ( 3.28 usr + 0.05 sys = 3.33 CPU) @ 60.08/s (n=200) - - SOAP::WSDL::SAX::MessageHandler (with raw XML::LibXML): - 5 wallclock secs ( 4.95 usr + 0.00 sys = 4.95 CPU) @ 40.38/s (n=200) - - XML::Simple (XML::Parser): - 3 wallclock secs ( 2.36 usr + 0.03 sys = 2.39 CPU) @ 83.65/s (n=200) - - XML::Simple (XML::SAX::Expat): - 7 wallclock secs ( 6.50 usr + 0.03 sys = 6.53 CPU) @ 30.62/s (n=200) - -As the benchmark shows, all SOAP::WSDL parser variants are faster than -XML::Simple with XML::SAX::Expat, and SOAP::WSDL::Expat::MessageParser almost -reaches the performance of XML::Simple with XML::Parser as backend. - -Parsing SOAP responses in chunks does not increase speed - at least not up -to a response size of around 500k: - - Benchmark: timing 5 iterations of SOAP::WSDL::SAX::MessageHandler, - SOAP::WSDL::Expat::MessageParser, SOAP::WSDL::Expat::MessageStreamParser... - - SOAP::WSDL::Expat::MessageStreamParser: - 13 wallclock secs ( 7.39 usr + 0.09 sys = 7.48 CPU) @ 0.67/s (n=5) - - SOAP::WSDL::Expat::MessageParser: - 10 wallclock secs ( 5.81 usr + 0.06 sys = 5.88 CPU) @ 0.85/s (n=5) - - SOAP::WSDL::SAX::MessageHandler: - 14 wallclock secs ( 8.78 usr + 0.03 sys = 8.81 CPU) @ 0.57/s (n=5) - - Response size: 344330 bytes +=cut =head1 OLD SAX HANDLER -The old SAX handler historically used in SOAP::WSDL are not included in +Historically, SOAP::WSDL used SAX for parsing XML. The SAX handlers were +implemented as L handlers, which also worked with +L. + +Support for SAX and L in SOAP::WSDL is discontinued +for the following reasons: + +=over + +=item * Speed + +L is faster than +L - at least when optimized for speed. + +High parsing speed is one of the key requirements for a SOAP toolkit - if XML +serializing and (more important) deserializing are not fast enough, the whole +toolkit is unusable. + +=item * Availability + +L is more popular than L. + +=item * Stability + +XML::LibXML is based on the libxml2 library. Several versions of +libxml2 are known to have specific bugs. As a workaround, there are +often several versions of libxml2 installed on one system. This may +lead to problems on operating systems which cannot load more than +one version of a shared library simultaneously. + +XML::LibXML is also still under development, while XML::Parser has had time +to stabilize. + +=item * SOAP::Lite uses XML::Parser + +L uses L if available. +SOAP::WSDL should not require users to install both L +and L. + +=back + +The old SAX handler historically used in SOAP::WSDL are not included in the SOAP::WSDL package any more. -However, they may be obtained from the "attic" directory in -SOAP::WSDL's SVN repository at +However, they may be obtained from the "attic" directory in +SOAP::WSDL's SVN repository at https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/attic @@ -223,10 +190,10 @@ https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/attic =item * SOAP::WSDL::SAX::WSDLHandler -This is a SAX handler for parsing WSDL files into object trees SOAP::WSDL +This is a SAX handler for parsing WSDL files into object trees SOAP::WSDL works with. -It's built as a native handler for XML::LibXML, but will also work with +It's built as a native handler for XML::LibXML, but will also work with XML::SAX::ParserFactory. To parse a WSDL file, use one of the following variants: @@ -237,7 +204,6 @@ To parse a WSDL file, use one of the following variants: $parser->parse( $xml ); my $data = $handler->get_data(); - my $handler = SOAP::WSDL::SAX::WSDLHandler->new({ base => 'XML::SAX::Base' }); @@ -247,18 +213,35 @@ To parse a WSDL file, use one of the following variants: $parser->parse( $xml ); my $data = $handler->get_data(); - =item * SOAP::WSDL::SAX::MessageHandler -This is a SAX handler for parsing WSDL files into object trees SOAP::WSDL +This is a SAX handler for parsing WSDL files into object trees SOAP::WSDL works with. -It's built as a native handler for XML::LibXML, but will also work with +It's built as a native handler for XML::LibXML, but will also work with XML::SAX::ParserFactory. -Can be used for parsing both streams (chunks) and documents. +Can be used for parsing both streams (chunks) and documents. =back +=head1 LICENSE AND COPYRIGHT + +Copyright 2007 Martin Kutter. + +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself. + +=head1 AUTHOR + +Martin Kutter Emartin.kutter fen-net.deE + +=head1 REPOSITORY INFORMATION + + $Rev: 391 $ + $LastChangedBy: kutterma $ + $Id: Parser.pod 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Parser.pod $ + +=cut -=cut \ No newline at end of file diff --git a/lib/SOAP/WSDL/Manual/Serializer.pod b/lib/SOAP/WSDL/Manual/Serializer.pod new file mode 100644 index 0000000..0793992 --- /dev/null +++ b/lib/SOAP/WSDL/Manual/Serializer.pod @@ -0,0 +1,30 @@ +=pod + +=head1 NAME + +SOAP::WSDL::Manual::Serializer + +=head1 SERIALIZER CLASSES + +Serializer classes convert perl data structures to XML. + +SOAP::WSDL comes with one builtin serializer class: +L. + +=head1 WRITING YOUR OWN SERIALIZER + +See L. + +=head1 LICENSE + +Copyright 2007 Martin Kutter. + +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself + +=head1 AUTHOR + +Martin Kutter Emartin.kutter fen-net.deE + +=cut + \ No newline at end of file diff --git a/lib/SOAP/WSDL/Manual/WS_I.pod b/lib/SOAP/WSDL/Manual/WS_I.pod index 5c49168..560d31c 100644 --- a/lib/SOAP/WSDL/Manual/WS_I.pod +++ b/lib/SOAP/WSDL/Manual/WS_I.pod @@ -6,15 +6,15 @@ SOAP::WSDL::Manual::WS_I - How SOAP::WSDL complies to WS-I Basic Profile 1.0 =head1 DESCRIPTION -This document gives an overview about how SOAP::WSDL confirms to the rules of -the WS-I Basic Profile 1.0 found at +This document gives an overview about how SOAP::WSDL confirms to the rules of +the WS-I Basic Profile 1.0 found at L Errata are not yet worked in. -You may find rules mis-categorized, especially in the "not applicable" section. +You may find rules mis-categorized, especially in the "not applicable" section. -Such mis-categorizations are documentation bugs, please feel free to report +Such mis-categorizations are documentation bugs, please feel free to report them. Rules are categorized into the following sections: @@ -23,21 +23,21 @@ Rules are categorized into the following sections: =item * RULES CONFIRMED -This section contains rules SOAP::WSDL follows. Conformance to these rules may +This section contains rules SOAP::WSDL follows. Conformance to these rules may be assured by a test. =item * RULES NOT CONFIRMED -This section contains rules SOAP::WSDL does not follow yet. These may be +This section contains rules SOAP::WSDL does not follow yet. These may be considered as bugs. =item * RULES NOT APPLICABLE -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 +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 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. =back @@ -46,18 +46,18 @@ parts to web service SOAP::WSDL does not implement. =head2 R1005 - A MESSAGE MUST NOT contain soap:encodingStyle attributes on any of the elements + A MESSAGE MUST NOT contain soap:encodingStyle attributes on any of the elements whose namespace name is "http://schemas.xmlsoap.org/soap/envelope/". -SOAP::WSDL::Serializer::SOAP11 does not add soap:encodingStyle attributes on any +SOAP::WSDL::Serializer::SOAP11 does not add soap:encodingStyle attributes on any element. -=head2 R1006 +=head2 R1006 - A MESSAGE MUST NOT contain soap:encodingStyle attributes on any element that is + A MESSAGE MUST NOT contain soap:encodingStyle attributes on any element that is a child of soap:Body. -SOAP::WSDL::Serializer::SOAP11 does not add soap:encodingStyle attributes on any +SOAP::WSDL::Serializer::SOAP11 does not add soap:encodingStyle attributes on any element. =head2 R1008 @@ -66,7 +66,7 @@ element. SOAP::WSDL::Serializer::SOAP11 does not add DTDs. -=head2 R1009 +=head2 R1009 A MESSAGE MUST NOT contain Processing Instructions. @@ -80,10 +80,10 @@ SOAP::WSDL::Expat::MessageParser allows the use of XML Declarations. =head2 R1011 - A MESSAGE MUST NOT have any element children of soap:Envelope following + A MESSAGE MUST NOT have any element children of soap:Envelope following the soap:Body element. -SOAP::WSDL::Serializer::SOAP11 does not emit children of soap:Envelope following +SOAP::WSDL::Serializer::SOAP11 does not emit children of soap:Envelope following the soap:Body element. Other serializers may behave differentls. =head2 R1012 @@ -92,69 +92,69 @@ the soap:Body element. Other serializers may behave differentls. SOAP::WSDL::Serializer::SOAP11 serializes messages as UTF-8. -=head2 R1018 +=head2 R1018 - The media type of a MESSAGE's envelope MUST indicate the correct character + The media type of a MESSAGE's envelope MUST indicate the correct character encoding, using the charset parameter. -SOAP::WSDL::Transport::HTTP sets the Content-type header to -"text/xml; charset=utf8". SOAP::Transport does, too. Other transport +SOAP::WSDL::Transport::HTTP sets the Content-type header to +"text/xml; charset=utf8". SOAP::Transport does, too. Other transport backends may behave different. =head2 R1014 - The children of the soap:Body element in a MESSAGE MUST be namespace + The children of the soap:Body element in a MESSAGE MUST be namespace qualified. -SOAP::WSDL::Serializer::SOAP11 emits namespace-qualified child elements +SOAP::WSDL::Serializer::SOAP11 emits namespace-qualified child elements of the soap:Body element. -=head2 R1017 +=head2 R1017 - A RECEIVER MUST NOT mandate the use of the xsi:type attribute in messages - except as required in order to indicate a derived type (see XML Schema + A RECEIVER MUST NOT mandate the use of the xsi:type attribute in messages + except as required in order to indicate a derived type (see XML Schema Part 1: Structures, Section 2.6.1). -SOAP::WSDL::Expat::MessageParser does not require the use of xsi:type -attributes, but uses typemaps instead. +SOAP::WSDL::Expat::MessageParser does not require the use of xsi:type +attributes, but uses typemaps instead. Other deserializers may not comply to this rule. =head2 R1028 - When a Fault is generated by a RECEIVER, further processing SHOULD NOT be - performed on the SOAP message aside from that which is necessary to rollback, - or compensate for, any effects of processing the message prior to the + When a Fault is generated by a RECEIVER, further processing SHOULD NOT be + performed on the SOAP message aside from that which is necessary to rollback, + or compensate for, any effects of processing the message prior to the generation of the Fault. -A fault is generated when an error occurs processing the message. -SOAP::WSDL::Deserializer::SOAP11 does not perform any additional processing +A fault is generated when an error occurs processing the message. +SOAP::WSDL::Deserializer::SOAP11 does not perform any additional processing after an error occured. -=head2 R1029 +=head2 R1029 - Where the normal outcome of processing a SOAP message would have resulted - in the transmission of a SOAP response, but rather a SOAP Fault is generated - instead, a RECEIVER MUST transmit a SOAP Fault message in place of the + Where the normal outcome of processing a SOAP message would have resulted + in the transmission of a SOAP response, but rather a SOAP Fault is generated + instead, a RECEIVER MUST transmit a SOAP Fault message in place of the response. A fault is generated when an error occurs processing the message. -=head2 R1030 +=head2 R1030 - A RECEIVER that generates a SOAP Fault SHOULD notify the end user that a - SOAP Fault has been generated when practical, by whatever means is deemed - appropriate to the circumstance. + A RECEIVER that generates a SOAP Fault SHOULD notify the end user that a + SOAP Fault has been generated when practical, by whatever means is deemed + appropriate to the circumstance. Via return value. -=head2 R1140 +=head2 R1140 A MESSAGE SHOULD be sent using HTTP/1.1. SOAP::WSDL::Transport::HTTP uses HTTP/1.1 -=head2 R1141 +=head2 R1141 A MESSAGE MUST be sent using either HTTP/1.1 or HTTP/1.0. @@ -162,7 +162,7 @@ SOAP::WSDL::Transport::HTTP uses HTTP/1.1 =head2 R1107 - A RECEIVER MUST interpret SOAP messages containing only a soap:Fault element + A RECEIVER MUST interpret SOAP messages containing only a soap:Fault element as a Fault. SOAP::WSDL::Deserializer::SOAP11 does this. @@ -173,26 +173,26 @@ SOAP::WSDL::Deserializer::SOAP11 does this. Both SOAP::WSDL::Transport::HTTP and SOAP::Transport::HTTP use POST. -=head2 R1108 +=head2 R1108 A MESSAGE MUST NOT use the HTTP Extension Framework (RFC2774). -SOAP::WSDL::Transport::HTTP does not use the HTTP Extension framework, +SOAP::WSDL::Transport::HTTP does not use the HTTP Extension framework, however SOAP::Transport::HTTP use M-POST if POST was not successful. -To be sure you comply to this rule, use SOAP::WSDL::Transport::HTTP as +To be sure you comply to this rule, use SOAP::WSDL::Transport::HTTP as transport backend. =head2 R1109 - The value of the SOAPAction HTTP header field in a HTTP request + The value of the SOAPAction HTTP header field in a HTTP request MESSAGE MUST be a quoted string. -SOAP::WSDL::Client always quotes the SOAPAction header. +SOAP::WSDL::Client always quotes the SOAPAction header. =head2 R1119 - A RECEIVER MAY respond with a Fault if the value of the SOAPAction + A RECEIVER MAY respond with a Fault if the value of the SOAPAction HTTP header field is not quoted. SOAP::WSDL does not apply any processing on the SOAPAction header @@ -200,48 +200,48 @@ field. =head2 R1131 - A CONSUMER MAY automatically redirect a request when it encounters a + A CONSUMER MAY automatically redirect a request when it encounters a "307 Temporary Redirect" HTTP status code in a response. -LWP::UserAgent (used by SOAP::WSDL::Transport::HTTP and +LWP::UserAgent (used by SOAP::WSDL::Transport::HTTP and SOAP::Transport::HTTP) accepts up to 7 levels of redirect by default. =head2 R2113 - A MESSAGE containing serialized arrays MUST NOT include the + A MESSAGE containing serialized arrays MUST NOT include the soapenc:arrayType attribute. SOAP::WSDL does not natively support soapenc::arrayType. =head2 R2114 - The target namespace for WSDL definitions and the target namespace for + The target namespace for WSDL definitions and the target namespace for schema definitions in a DESCRIPTION MAY be the same. -SOAP::WSDL does not impose any constraints on the target namespace for +SOAP::WSDL does not impose any constraints on the target namespace for WSDL definitions or schema definitions. =head2 R2301 - The order of the elements in the soap:body of a MESSAGE MUST be the same + The order of the elements in the soap:body of a MESSAGE MUST be the same as that of the wsdl:parts in the wsdl:message that describes it. SOAP::WSDL obeys the part order. =head2 R2712 - A document-literal binding MUST be represented on the wire as a - MESSAGE with a soap:Body whose child element is an instance of the - global element declaration referenced by the corresponding wsdl:message + A document-literal binding MUST be represented on the wire as a + MESSAGE with a soap:Body whose child element is an instance of the + global element declaration referenced by the corresponding wsdl:message part. -If defined accordingly in the DESCRIPTION, SOAP::WSDL issues +If defined accordingly in the DESCRIPTION, SOAP::WSDL issues document-literal binding operation MESSAGES conforming to this rule. -=head2 R2748 +=head2 R2748 - A CONSUMER MUST NOT interpret the presence of the wsdl:required attribute - on a soapbind extension element with a value of "false" to mean the extension + A CONSUMER MUST NOT interpret the presence of the wsdl:required attribute + on a soapbind extension element with a value of "false" to mean the extension element is optional in the messages generated from the WSDL description. SOAP::WSDL does not imterpret the wsdl:required attribute at all. @@ -258,49 +258,48 @@ SOAP::WSDL supports https. SOAP::WSDL supports all kinds of authentication known to LWP::UserAgent -=head2 R2742 +=head2 R2742 - A MESSAGE MAY contain a fault detail entry in a SOAP fault that is not + A MESSAGE MAY contain a fault detail entry in a SOAP fault that is not described by a wsdl:fault element in the corresponding WSDL description. -SOAP::WSDL does not emit such faults. Such faults can be processed by adding +SOAP::WSDL does not emit such faults. Such faults can be processed by adding custom maps to the type maps for SOAP::WSDL::Expat::MessageParser. =head2 R2744 - A HTTP request MESSAGE MUST contain a SOAPAction HTTP header field with a - quoted value equal to the value of the soapAction attribute of + A HTTP request MESSAGE MUST contain a SOAPAction HTTP header field with a + quoted value equal to the value of the soapAction attribute of soapbind:operation, if present in the corresponding WSDL description. -SOAP::WSDL uses the soapAction attribute from soapbind:operation as SOAPAction +SOAP::WSDL uses the soapAction attribute from soapbind:operation as SOAPAction header in generated code. -Alternative WSDL parsers / code generator have to assure they pass the correct +Alternative WSDL parsers / code generator have to assure they pass the correct soap_action to SOAP::WSDL::Client. -The interpreting SOAP::WSDL client does not conform to this rule, but "guesses" +The interpreting SOAP::WSDL client does not conform to this rule, but "guesses" the SOAPAction header from the operation name and the top node's namespace. =head2 R2745 - A HTTP request MESSAGE MUST contain a SOAPAction HTTP header field with a - quoted empty string value, if in the corresponding WSDL description, the - soapAction of soapbind:operation is either not present, or present with an - empty string as its value. + A HTTP request MESSAGE MUST contain a SOAPAction HTTP header field with a + quoted empty string value, if in the corresponding WSDL description, the + soapAction of soapbind:operation is either not present, or present with an + empty string as its value. -SOAP::WSDL::Client always assures the SOAPaction header is quoted, thus +SOAP::WSDL::Client always assures the SOAPaction header is quoted, thus automatically inserts the empty string if no SOAPAction header is defined. - =head2 R1015 - A RECEIVER MUST generate a fault if they encounter a message whose document - element has a local name of "Envelope" but a namespace name that is not + A RECEIVER MUST generate a fault if they encounter a message whose document + element has a local name of "Envelope" but a namespace name that is not "http://schemas.xmlsoap.org/soap/envelope/". SOAP::WSDL::Expat::MessageParser checks the namespace of the SOAP envelope. -SOAP::WSDL::Expat::MessageParser does not check that Envelope is the root +SOAP::WSDL::Expat::MessageParser does not check that Envelope is the root element, yet. @@ -308,7 +307,7 @@ element, yet. =head2 R4001 - A RECEIVER MUST accept messages that include the Unicode Byte Order Mark + A RECEIVER MUST accept messages that include the Unicode Byte Order Mark (BOM). May automatically work with XML::Parser::Expat, but is not testet yet. @@ -317,46 +316,46 @@ TODO write test. If not confirmed, add encoding support. =head2 R1002 - A RECEIVER MUST accept fault messages that have any number of elements, - including zero, appearing as children of the detail element. Such children + A RECEIVER MUST accept fault messages that have any number of elements, + including zero, appearing as children of the detail element. Such children can be qualified or unqualified. -Partially confirmed: This only works when the fault detail elements are added to +Partially confirmed: This only works when the fault detail elements are added to the deserializer's typemap. TODO add processing of arbitrary content of faults to SOAP::WSDL::Expat::MessageParser -=head2 R1003 - - A RECEIVER MUST accept fault messages that have any number of qualified or - unqualified attributes, including zero, appearing on the detail element. - The namespace of qualified attributes can be anything other than - "http://schemas.xmlsoap.org/soap/envelope/". +=head2 R1003 + + A RECEIVER MUST accept fault messages that have any number of qualified or + unqualified attributes, including zero, appearing on the detail element. + The namespace of qualified attributes can be anything other than + "http://schemas.xmlsoap.org/soap/envelope/". TODO add processing of arbitrary attributes to SOAP::WSDL::SOAP::Typelib::Fault11 -=head2 R1016 +=head2 R1016 - A RECEIVER MUST accept fault messages that carry an xml:lang attribute on + A RECEIVER MUST accept fault messages that carry an xml:lang attribute on the faultstring element. TODO add processing of the xml:lang attribute to SOAP::WSDL::SOAP::Typelib::Fault11 =head2 R1007 - A MESSAGE described in an rpc-literal binding MUST NOT contain soap:encodingStyle + A MESSAGE described in an rpc-literal binding MUST NOT contain soap:encodingStyle attribute on any elements are grandchildren of soap:Body. -SOAP::WSDL::Serializer::SOAP11 does not add soap:encodingStyle attributes on any +SOAP::WSDL::Serializer::SOAP11 does not add soap:encodingStyle attributes on any element. However, rpc-literal bindings are not supported, yet. TODO support rpc-literal bindings. -=head2 R2008 +=head2 R2008 - 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. SOAP::WSDL's schema parser does not handle import elements yet. @@ -377,33 +376,33 @@ TODO Test whether UTF-16 works. =head2 R2020 - 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. SOAP::WSDL's schema parser does not handle import elements yet. TODO implement support for wsdl:import in SOAP::WSDL::Expat::WSDLParser. -=head2 R2024 +=head2 R2024 - The wsdl:documentation element MAY occur as a first child of the + The wsdl:documentation element MAY occur as a first child of the wsdl:definitions element in a DESCRIPTION. TODO Test. =head2 R2027 - If during the processing of an element in the WSDL namespace in a - description, a consumer encounters a WSDL extension element amongst - its element children, that has a wsdl:required attribute with a boolean - value of "true" that the consumer does not understand or cannot process, + If during the processing of an element in the WSDL namespace in a + description, a consumer encounters a WSDL extension element amongst + its element children, that has a wsdl:required attribute with a boolean + value of "true" that the consumer does not understand or cannot process, the CONSUMER MUST fail processing of that element in the WSDL namespace. TODO Implement support for wsdl:required =head2 R2750 - A CONSUMER MUST ignore a SOAP response carried in a response from a + A CONSUMER MUST ignore a SOAP response carried in a response from a one-way operation. SOAP::WSDL does not ignore the SOAP response from a one way operation yet. @@ -412,9 +411,9 @@ TODO Define operation type signature, and ignore result from one way operations. =head2 R2747 - A CONSUMER MUST understand and process all WSDL 1.1 SOAP Binding extension - elements, irrespective of the presence or absence of the wsdl:required - attribute on an extension element; and irrespective of the value of the + A CONSUMER MUST understand and process all WSDL 1.1 SOAP Binding extension + elements, irrespective of the presence or absence of the wsdl:required + attribute on an extension element; and irrespective of the value of the wsdl:required attribute, when present. SOAP::WSDL does not implement all WSDL 1.1 SOAP Binding extension yet. @@ -425,134 +424,133 @@ TODO check and implement. A DESCRIPTION MAY use any construct from XML Schema 1.0. -SOAP::WSDL's WSDL parser doen not allow all contructs from XML Schema 1.0 to +SOAP::WSDL's WSDL parser doen not allow all contructs from XML Schema 1.0 to be used. TODO become "minimal conformant". =head1 RULES NOT APPLICABLE -=head2 R0004 - +=head2 R0004 + A MESSAGE MAY contain conformance claims, as specified in the conformance claim schema. SOAP::WSDL::Serializer::SOAP11 does not add conformance claims. Other serializers may act different. -=head2 R0005 +=head2 R0005 A MESSAGE's conformance claims MUST be carried as SOAP header blocks. SOAP::WSDL::Serializer::SOAP11 does not add conformance claims. Other serializers may act different. -=head2 R0006 +=head2 R0006 A MESSAGE MAY contain conformance claims for more than one profile. SOAP::WSDL::Serializer::SOAP11 does not add conformance claims. Other serializers may act different. +=head2 R0007 -=head2 R0007 - - A SENDER MUST NOT use the soap:mustUnderstand attribute when sending a SOAP - header block containing a conformance claim. + A SENDER MUST NOT use the soap:mustUnderstand attribute when sending a SOAP + header block containing a conformance claim. SOAP::WSDL::Serializer::SOAP11 does not add conformance claims. Other serializers may act different. -=head2 R3020 +=head2 R3020 - REGDATA of type uddi:tModel claiming conformance with a Profile MUST be + REGDATA of type uddi:tModel claiming conformance with a Profile MUST be categorized using the ws-i-org:conformsTo:2002_12 taxonomy. SOAP::WSDL does not publish web services yet. -=head2 R3030 +=head2 R3030 - REGDATA of type uddi:tModel claiming conformance with a Profile MUST use - the ws-i-org:conformsTo:2002_12 categorization value corresponding to + REGDATA of type uddi:tModel claiming conformance with a Profile MUST use + the ws-i-org:conformsTo:2002_12 categorization value corresponding to the conformance claim URI for that Profile. SOAP::WSDL does not publish web services yet. -=head2 R3021 +=head2 R3021 - A REGISTRY MUST support the WS-I Conformance category system by adding - the ws-i-org:conformsTo:2002_12 tModel definition to its registry content. + A REGISTRY MUST support the WS-I Conformance category system by adding + the ws-i-org:conformsTo:2002_12 tModel definition to its registry content. SOAP::WSDL does not publish web services yet. -=head2 R3005 +=head2 R3005 - REGDATA other than uddi:tModel elements representing conformant Web service - types MUST NOT be categorized using the ws-i-org:conformsTo:2002_12 + REGDATA other than uddi:tModel elements representing conformant Web service + types MUST NOT be categorized using the ws-i-org:conformsTo:2002_12 taxonomy and a categorization of "http://ws-i.org/profiles/basic/1.0". SOAP::WSDL does not publish web services yet. -=head2 R3004 +=head2 R3004 - REGDATA of type uddi:tModel MUST be constructed so that the conformance - claim it makes is consistent with the conformance claim made by the + REGDATA of type uddi:tModel MUST be constructed so that the conformance + claim it makes is consistent with the conformance claim made by the wsdl:binding to which it refers. SOAP::WSDL does not publish web services yet. =head2 R1000 - When a MESSAGE contains a soap:Fault element, that element MUST NOT have element + When a MESSAGE contains a soap:Fault element, that element MUST NOT have element children other than faultcode, faultstring, faultactor and detail. -SOAP::WSDL does not send fault messages. However, SOAP::WSDL::SOAP::Typelib::Fault11 +SOAP::WSDL does not send fault messages. However, SOAP::WSDL::SOAP::Typelib::Fault11 complies to this rule. =head2 R1001 - When a MESSAGE contains a soap:Fault element its element children MUST be + When a MESSAGE contains a soap:Fault element its element children MUST be unqualified. -SOAP::WSDL does not send fault messages. However, SOAP::WSDL::SOAP::Typelib::Fault11 +SOAP::WSDL does not send fault messages. However, SOAP::WSDL::SOAP::Typelib::Fault11 complies to this rule. =head2 R1004 - When a MESSAGE contains a faultcode element the content of that element - SHOULD be one of the fault codes defined in SOAP 1.1 or a namespace qualified + When a MESSAGE contains a faultcode element the content of that element + SHOULD be one of the fault codes defined in SOAP 1.1 or a namespace qualified fault code. -SOAP::WSDL does not send fault messages. However, the fault issued by +SOAP::WSDL does not send fault messages. However, the fault issued by SOAP::WSDL::Deserializer comply to this rule. -=head2 R1031 +=head2 R1031 - When a MESSAGE contains a faultcode element the content of that element SHOULD - NOT use of the SOAP 1.1 "dot" notation to refine the meaning of the Fault. + When a MESSAGE contains a faultcode element the content of that element SHOULD + NOT use of the SOAP 1.1 "dot" notation to refine the meaning of the Fault. -SOAP::WSDL does not send fault messages. However, the fault issued by +SOAP::WSDL does not send fault messages. However, the fault issued by SOAP::WSDL::Deserializer comply to this rule. =head2 R1013 - A MESSAGE containing a soap:mustUnderstand attribute MUST only use the lexical + A MESSAGE containing a soap:mustUnderstand attribute MUST only use the lexical forms "0" and "1". SOAP::WSDL does not add soap:mustUnderstand attributes. =head2 R1025 - A RECEIVER MUST handle messages in such a way that it appears that all - checking of mandatory header blocks is performed before any actual + A RECEIVER MUST handle messages in such a way that it appears that all + checking of mandatory header blocks is performed before any actual processing. SOAP::WSDL does not check mandatory header blocks yet. =head2 R1027 - A RECEIVER MUST generate a "soap:MustUnderstand" fault when a message - contains a mandatory header block (i.e., one that has a soap:mustUnderstand - attribute with the value "1") targeted at the receiver (via soap:actor) + A RECEIVER MUST generate a "soap:MustUnderstand" fault when a message + contains a mandatory header block (i.e., one that has a soap:mustUnderstand + attribute with the value "1") targeted at the receiver (via soap:actor) that the receiver does not understand. SOAP::WSDL does not check mandatory header blocks yet. @@ -565,58 +563,58 @@ SOAP::WSDL does not act as server yet. =head2 R1124 - An INSTANCE MUST use a 2xx HTTP status code for responses that + An INSTANCE MUST use a 2xx HTTP status code for responses that indicate a successful outcome of a request. SOAP::WSDL does not act as server yet. =head2 R1111 - An INSTANCE SHOULD use a "200 OK" HTTP status code for responses + An INSTANCE SHOULD use a "200 OK" HTTP status code for responses that contain a SOAP message that is not a SOAP fault. SOAP::WSDL does not act as server yet. =head2 R1112 - An INSTANCE SHOULD use either a "200 OK" or "202 Accepted" HTTP - status code for a response that does do not contain a SOAP message + An INSTANCE SHOULD use either a "200 OK" or "202 Accepted" HTTP + status code for a response that does do not contain a SOAP message but indicates successful HTTP outcome of a request. SOAP::WSDL does not act as server yet. =head2 R1130 - An INSTANCE MUST use HTTP status code "307 Temporary Redirect" + An INSTANCE MUST use HTTP status code "307 Temporary Redirect" when redirecting a request to a different endpoint. SOAP::WSDL does not act as server yet. =head2 R1125 - An INSTANCE MUST use a 4xx HTTP status code for responses that indicate + An INSTANCE MUST use a 4xx HTTP status code for responses that indicate a problem with the format of the request. SOAP::WSDL does not act as server yet. =head2 R1113 - An INSTANCE SHOULD use a "400 Bad Request "HTTP status code, if the + An INSTANCE SHOULD use a "400 Bad Request "HTTP status code, if the request message is a malformed HTTP request, or not well-formed XML. SOAP::WSDL does not act as server yet. =head2 R1114 - An INSTANCE SHOULD use a "405 Method not Allowed" HTTP status code if the + An INSTANCE SHOULD use a "405 Method not Allowed" HTTP status code if the request method was not "POST". SOAP::WSDL does not act as server yet. =head2 R1115 - An INSTANCE SHOULD use a "415 Unsupported Media Type" HTTP status code if - the Content-Type HTTP request header did not have a value consistent with + An INSTANCE SHOULD use a "415 Unsupported Media Type" HTTP status code if + the Content-Type HTTP request header did not have a value consistent with the value specified for the corresponding binding of the input message. SOAP::WSDL does not act as server yet. @@ -633,9 +631,9 @@ SOAP::WSDL does not act as server yet. SOAP::WSDL does not act as server yet. -=head2 R1121 +=head2 R1121 - An INSTANCE SHOULD NOT require consumer support for Cookies in order to + An INSTANCE SHOULD NOT require consumer support for Cookies in order to function correctly SOAP::WSDL does not act as server yet. @@ -648,122 +646,122 @@ SOAP::WSDL does not act as server yet. =head2 R2028 - A DESCRIPTION using the WSDL namespace (prefixed "wsdl" in this Profile) - MUST be valid according to the XML Schema found at + A DESCRIPTION using the WSDL namespace (prefixed "wsdl" in this Profile) + MUST be valid according to the XML Schema found at "http://schemas.xmlsoap.org/wsdl/2003-02-11.xsd". See 2029. -=head2 R2029 +=head2 R2029 - A DESCRIPTION using the WSDL SOAP binding namespace (prefixed "soapbind" - in this Profile) MUST be valid according to the XML Schema found at + A DESCRIPTION using the WSDL SOAP binding namespace (prefixed "soapbind" + in this Profile) MUST be valid according to the XML Schema found at "http://schemas.xmlsoap.org/wsdl/soap/2003-02-11.xsd". -Although the Profile requires WSDL descriptions to be Schema valid, -it does not require consumers to validate WSDL documents. +Although the Profile requires WSDL descriptions to be Schema valid, +it does not require consumers to validate WSDL documents. -It is the responsibility of a WSDL document's author to assure that it +It is the responsibility of a WSDL document's author to assure that it is Schema valid. =head2 R2001 - 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. -SOAP::WSDL has no means of generating WSDL definitions. +SOAP::WSDL has no means of generating WSDL definitions -=head2 R2002 +=head2 R2002 - To import XML Schema Definitions, a DESCRIPTION MUST use the XML Schema + To import XML Schema Definitions, a DESCRIPTION MUST use the XML Schema "import" statement. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2003 +=head2 R2003 - A DESCRIPTION MUST use the XML Schema "import" statement only within the + A DESCRIPTION MUST use the XML Schema "import" statement only within the xsd:schema element of the types section. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2004 - A DESCRIPTION MUST NOT use the XML Schema "import" statement to import a - Schema from any document whose root element is not "schema" from the + A DESCRIPTION MUST NOT use the XML Schema "import" statement to import a + Schema from any document whose root element is not "schema" from the namespace "http://www.w3.org/2001/XMLSchema". SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2009 +=head2 R2009 - An XML Schema directly or indirectly imported by a DESCRIPTION MAY include + An XML Schema directly or indirectly imported by a DESCRIPTION MAY include the Unicode Byte Order Mark (BOM). SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2010 +=head2 R2010 - An XML Schema directly or indirectly imported by a DESCRIPTION MUST + An XML Schema directly or indirectly imported by a DESCRIPTION MUST use either UTF-8 or UTF-16 encoding. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2011 +=head2 R2011 - An XML Schema directly or indirectly imported by a DESCRIPTION MUST use + An XML Schema directly or indirectly imported by a DESCRIPTION MUST use version 1.0 of the eXtensible Markup Language W3C Recommendation. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2007 - A DESCRIPTION MUST specify a non-empty location attribute on the wsdl:import + A DESCRIPTION MUST specify a non-empty location attribute on the wsdl:import element. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2022 +=head2 R2022 - When they appear in a DESCRIPTION, wsdl:import elements MUST precede all + When they appear in a DESCRIPTION, wsdl:import elements MUST precede all other elements from the WSDL namespace except wsdl:documentation. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2023 +=head2 R2023 - When they appear in a DESCRIPTION, wsdl:types elements MUST precede all - other elements from the WSDL namespace except wsdl:documentation and + When they appear in a DESCRIPTION, wsdl:types elements MUST precede all + other elements from the WSDL namespace except wsdl:documentation and wsdl:import. SOAP::WSDL has no means of generating WSDL definitions. =head2 R4004 - A DESCRIPTION MUST use version 1.0 of the eXtensible Markup Language W3C + A DESCRIPTION MUST use version 1.0 of the eXtensible Markup Language W3C Recommendation. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2005 - The targetNamespace attribute on the wsdl:definitions element of a - description that is being imported MUST have same the value as the - namespace attribute on the wsdl:import element in the importing + The targetNamespace attribute on the wsdl:definitions element of a + description that is being imported MUST have same the value as the + namespace attribute on the wsdl:import element in the importing DESCRIPTION. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2021 +=head2 R2021 - The wsdl:documentation element MAY occur as a child of the wsdl:part + The wsdl:documentation element MAY occur as a child of the wsdl:part element in a DESCRIPTION. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2025 - A DESCRIPTION containing WSDL extensions MUST NOT use them to + A DESCRIPTION containing WSDL extensions MUST NOT use them to contradict other requirements of the Profile. SOAP::WSDL has no means of generating WSDL definitions. @@ -771,202 +769,202 @@ SOAP::WSDL has no means of generating WSDL definitions. =head2 R2026 A DESCRIPTION SHOULD NOT include extension elements with a wsdl:required - attribute value of "true" on any WSDL construct (wsdl:binding, - wsdl:portType, wsdl:message, wsdl:types or wsdl:import) that claims + attribute value of "true" on any WSDL construct (wsdl:binding, + wsdl:portType, wsdl:message, wsdl:types or wsdl:import) that claims conformance to the Profile. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2101 - A DESCRIPTION MUST NOT use QName references to elements in namespaces that + A DESCRIPTION MUST NOT use QName references to elements in namespaces that have been neither imported, nor defined in the referring WSDL document. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2102 +=head2 R2102 - A QName reference to a Schema component in a DESCRIPTION MUST use the - namespace defined in the targetNamespace attribute on the xsd:schema - element, or to a namespace defined in the namespace attribute on an + A QName reference to a Schema component in a DESCRIPTION MUST use the + namespace defined in the targetNamespace attribute on the xsd:schema + element, or to a namespace defined in the namespace attribute on an xsd:import element within the xsd:schema element. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2105 - All xsd:schema elements contained in a wsdl:types element of a - DESCRIPTION MUST have a targetNamespace attribute with a valid and non-null - value, UNLESS the xsd:schema element has xsd:import and/or + All xsd:schema elements contained in a wsdl:types element of a + DESCRIPTION MUST have a targetNamespace attribute with a valid and non-null + value, UNLESS the xsd:schema element has xsd:import and/or xsd:annotation as its only child element(s). SOAP::WSDL has no means of generating WSDL definitions. =head2 R2110 - In a DESCRIPTION, array declarations MUST NOT extend or restrict the + In a DESCRIPTION, array declarations MUST NOT extend or restrict the soapenc:Array type. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2111 - In a DESCRIPTION, array declarations MUST NOT use wsdl:arrayType attribute + In a DESCRIPTION, array declarations MUST NOT use wsdl:arrayType attribute in the type declaration. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2112 - In a DESCRIPTION, array declaration wrapper elements SHOULD NOT be named - using the convention ArrayOfXXX. + In a DESCRIPTION, array declaration wrapper elements SHOULD NOT be named + using the convention ArrayOfXXX. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2201 - A document-literal binding in a DESCRIPTION MUST, in each of its - soapbind:body element(s), have at most one part listed in the parts + A document-literal binding in a DESCRIPTION MUST, in each of its + soapbind:body element(s), have at most one part listed in the parts attribute, if the parts attribute is specified. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2210 +=head2 R2210 - If a document-literal binding in a DESCRIPTION does not specify the parts - attribute on a soapbind:body element, the corresponding abstract + If a document-literal binding in a DESCRIPTION does not specify the parts + attribute on a soapbind:body element, the corresponding abstract wsdl:message MUST define zero or one wsdl:parts. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2202 - A wsdl:binding in a DESCRIPTION MAY contain soapbind:body element(s) that + A wsdl:binding in a DESCRIPTION MAY contain soapbind:body element(s) that specify that zero parts form the soap:Body. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2203 - An rpc-literal binding in a DESCRIPTION MUST refer, in its soapbind:body - element(s), only to wsdl:part element(s) that have been defined using the + An rpc-literal binding in a DESCRIPTION MUST refer, in its soapbind:body + element(s), only to wsdl:part element(s) that have been defined using the type attribute. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2211 - A MESSAGE described with an rpc-literal binding MUST NOT have the xsi:nil + A MESSAGE described with an rpc-literal binding MUST NOT have the xsi:nil attribute with a value of "1" or "true" on the part accessors. =head2 R2207 - A wsdl:message in a DESCRIPTION MAY contain wsdl:parts that use the - elements attribute provided those wsdl:parts are not referred to by a + A wsdl:message in a DESCRIPTION MAY contain wsdl:parts that use the + elements attribute provided those wsdl:parts are not referred to by a soapbind:body in an rpc-literal binding. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2204 - A document-literal binding in a DESCRIPTION MUST refer, in each of its - soapbind:body element(s), only to wsdl:part element(s) that have been + A document-literal binding in a DESCRIPTION MUST refer, in each of its + soapbind:body element(s), only to wsdl:part element(s) that have been defined using the element attribute. SOAP::WSDL has no means of generating WSDL definitions. Note: SOAP::WSDL requires that a DESCRIPTION confirms to these rules. -=head2 R2208 +=head2 R2208 - A binding in a DESCRIPTION MAY contain soapbind:header element(s) that - refer to wsdl:parts in the same wsdl:message that are referred to by its - soapbind:body element(s). + A binding in a DESCRIPTION MAY contain soapbind:header element(s) that + refer to wsdl:parts in the same wsdl:message that are referred to by its + soapbind:body element(s). =head2 R2205 - A wsdl:binding in a DESCRIPTION MUST refer, in each of its soapbind:header, - soapbind:headerfault and soapbind:fault elements, only to wsdl:part + A wsdl:binding in a DESCRIPTION MUST refer, in each of its soapbind:header, + soapbind:headerfault and soapbind:fault elements, only to wsdl:part element(s) that have been defined using the element attribute. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2209 - A wsdl:binding in a DESCRIPTION SHOULD bind every wsdl:part of a - wsdl:message in the wsdl:portType to which it refers to one of + A wsdl:binding in a DESCRIPTION SHOULD bind every wsdl:part of a + wsdl:message in the wsdl:portType to which it refers to one of soapbind:body, soapbind:header, soapbind:fault or soapbind:headerfault. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2206 - A wsdl:message in a DESCRIPTION containing a wsdl:part that uses the - element attribute MUST refer, in that attribute, to a global element + A wsdl:message in a DESCRIPTION containing a wsdl:part that uses the + element attribute MUST refer, in that attribute, to a global element declaration. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2302 +=head2 R2302 - A DESCRIPTION MAY use the parameterOrder attribute of an - wsdl:operation element to indicate the return value and method - signatures as a hint to code generators. + A DESCRIPTION MAY use the parameterOrder attribute of an + wsdl:operation element to indicate the return value and method + signatures as a hint to code generators. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2303 - A DESCRIPTION MUST NOT use Solicit-Response and Notification type + A DESCRIPTION MUST NOT use Solicit-Response and Notification type operations in a wsdl:portType definition. =head2 R2304 - A wsdl:portType in a DESCRIPTION MUST have operations with distinct + A wsdl:portType in a DESCRIPTION MUST have operations with distinct values for their name attributes. Note: SOAP::WSDL requires that a DESCRIPTION confirms to these rules. =head2 R2305 - A wsdl:portType in a DESCRIPTION MUST be constructed so that the - parameterOrder attribute, if present, omits at most 1 wsdl:part + A wsdl:portType in a DESCRIPTION MUST be constructed so that the + parameterOrder attribute, if present, omits at most 1 wsdl:part from the output message. =head2 R2306 - A wsdl:message in a DESCRIPTION MUST NOT specify both type and + A wsdl:message in a DESCRIPTION MUST NOT specify both type and element attributes on the same wsdl:part. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2401 +=head2 R2401 - A wsdl:binding element in a DESCRIPTION MUST use WSDL SOAP + A wsdl:binding element in a DESCRIPTION MUST use WSDL SOAP Binding as defined in WSDL 1.1 Section 3. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2701 - The wsdl:binding element in a DESCRIPTION MUST be constructed so - that its soapbind:binding child element specifies the transport - attribute. + The wsdl:binding element in a DESCRIPTION MUST be constructed so + that its soapbind:binding child element specifies the transport + attribute. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2702 - A wsdl:binding element in a DESCRIPTION MUST specify the HTTP - transport protocol with SOAP binding. Specifically, the transport - attribute of its soapbind:binding child MUST have the value + A wsdl:binding element in a DESCRIPTION MUST specify the HTTP + transport protocol with SOAP binding. Specifically, the transport + attribute of its soapbind:binding child MUST have the value "http://schemas.xmlsoap.org/soap/http". SOAP::WSDL has no means of generating WSDL definitions. =head2 R2705 - A wsdl:binding in a DESCRIPTION MUST use either be a rpc-literal + A wsdl:binding in a DESCRIPTION MUST use either be a rpc-literal binding or a document-literal binding. SOAP::WSDL has no means of generating WSDL definitions. @@ -975,267 +973,274 @@ Note: SOAP::WSDL does not support rpc-literal bindings yet. =head2 R2706 - A wsdl:binding in a DESCRIPTION MUST use the value of "literal" - for the use attribute in all soapbind:body, soapbind:fault, + A wsdl:binding in a DESCRIPTION MUST use the value of "literal" + for the use attribute in all soapbind:body, soapbind:fault, soapbind:header and soapbind:headerfault elements. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2707 - A wsdl:binding in a DESCRIPTION that contains one or more - soapbind:body, soapbind:fault, soapbind:header or soapbind:headerfault - elements that do not specify the use attribute MUST be interpreted as + A wsdl:binding in a DESCRIPTION that contains one or more + soapbind:body, soapbind:fault, soapbind:header or soapbind:headerfault + elements that do not specify the use attribute MUST be interpreted as though the value "literal" had been specified in each case. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2709 - A wsdl:portType in a DESCRIPTION MAY have zero or more wsdl:bindings + A wsdl:portType in a DESCRIPTION MAY have zero or more wsdl:bindings that refer to it, defined in the same or other WSDL documents. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2710 - The operations in a wsdl:binding in a DESCRIPTION MUST result in wire + The operations in a wsdl:binding in a DESCRIPTION MUST result in wire signatures that are different from one another. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2711 - A DESCRIPTION SHOULD NOT have more than one wsdl:port with the same + A DESCRIPTION SHOULD NOT have more than one wsdl:port with the same value for the location attribute of the soapbind:address element. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2714 -For one-way operations, an INSTANCE MUST NOT return a HTTP response -that contains a SOAP envelope. Specifically, the HTTP response +For one-way operations, an INSTANCE MUST NOT return a HTTP response +that contains a SOAP envelope. Specifically, the HTTP response entity-body must be empty. SOAP::WSDL does not act as a server, yet. =head2 R2727 - For one-way operations, a CONSUMER MUST NOT interpret a successful - HTTP response status code (i.e., 2xx) to mean the message is valid + For one-way operations, a CONSUMER MUST NOT interpret a successful + HTTP response status code (i.e., 2xx) to mean the message is valid or that the receiver would process it. -SOAP::WSDL regards a successful HTTP status code for a one-way operation -as an acknowledgement of the RECEIVER having receive (not processed!) -the message. +SOAP::WSDL regards a successful HTTP status code for a one-way operation +as an acknowledgement of the RECEIVER having receive (not processed!) +the message. -SOAP::WSDL makes no assumptions about the processing of SOAP messages, +SOAP::WSDL makes no assumptions about the processing of SOAP messages, but higher level clients may do. =head2 R2716 - A document-literal binding in a DESCRIPTION MUST NOT have the - namespace attribute specified on contained soapbind:body, + A document-literal binding in a DESCRIPTION MUST NOT have the + namespace attribute specified on contained soapbind:body, soapbind:header, soapbind:headerfault and soapbind:fault elements. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2717 +=head2 R2717 - An rpc-literal binding in a DESCRIPTION MUST have the namespace attribute - specified, the value of which MUST be an absolute URI, on + An rpc-literal binding in a DESCRIPTION MUST have the namespace attribute + specified, the value of which MUST be an absolute URI, on contained soapbind:body elements. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2726 +=head2 R2726 - An rpc-literal binding in a DESCRIPTION MUST NOT have the namespace - attribute specified on contained soapbind:header, soapbind:headerfault - and soapbind:fault elements. + An rpc-literal binding in a DESCRIPTION MUST NOT have the namespace + attribute specified on contained soapbind:header, soapbind:headerfault + and soapbind:fault elements. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2718 - A wsdl:binding in a DESCRIPTION MUST have the same set of + A wsdl:binding in a DESCRIPTION MUST have the same set of wsdl:operations as the wsdl:portType to which it refers SOAP::WSDL has no means of generating WSDL definitions. =head2 R2719 - A wsdl:binding in a DESCRIPTION MAY contain no soapbind:headerfault + A wsdl:binding in a DESCRIPTION MAY contain no soapbind:headerfault elements if there are no known header faults. SOAP::WSDL has no means of generating WSDL definitions. =head2 R2740 - A wsdl:binding in a DESCRIPTION SHOULD contain a soapbind:fault describing + A wsdl:binding in a DESCRIPTION SHOULD contain a soapbind:fault describing each known fault. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2741 +=head2 R2741 - A wsdl:binding in a DESCRIPTION SHOULD contain a soapbind:headerfault + A wsdl:binding in a DESCRIPTION SHOULD contain a soapbind:headerfault describing each known header fault. SOAP::WSDL has no means of generating WSDL definitions. -=head2 R2743 +=head2 R2743 - A MESSAGE MAY contain the details of a header processing related fault in a + A MESSAGE MAY contain the details of a header processing related fault in a SOAP header block that is not described by a wsdl:headerfault element in the - corresponding WSDL description. + corresponding WSDL description. =head2 R2720 - A wsdl:binding in a DESCRIPTION MUST use the attribute named part with a - schema type of "NMTOKEN" on all contained soapbind:header and + A wsdl:binding in a DESCRIPTION MUST use the attribute named part with a + schema type of "NMTOKEN" on all contained soapbind:header and soapbind:headerfault elements. =head2 R2749 - A wsdl:binding in a DESCRIPTION MUST NOT use the attribute named parts on - contained soapbind:header and soapbind:headerfault elements. + A wsdl:binding in a DESCRIPTION MUST NOT use the attribute named parts on + contained soapbind:header and soapbind:headerfault elements. =head2 R2721 - A wsdl:binding in a DESCRIPTION MUST have the name attribute specified on all + A wsdl:binding in a DESCRIPTION MUST have the name attribute specified on all contained soapbind:fault elements. =head2 R2754 - In a DESCRIPTION, the value of the name attribute on a soapbind:fault element - MUST match the value of the name attribute on its parent wsdl:fault element. + In a DESCRIPTION, the value of the name attribute on a soapbind:fault element + MUST match the value of the name attribute on its parent wsdl:fault element. =head2 R2722 - A wsdl:binding in a DESCRIPTION MAY specify the use attribute on contained + A wsdl:binding in a DESCRIPTION MAY specify the use attribute on contained soapbind:fault elements. =head2 R2723 - If in a wsdl:binding in a DESCRIPTION the use attribute on a contained + If in a wsdl:binding in a DESCRIPTION the use attribute on a contained soapbind:fault element is present, its value MUST be "literal". =head2 R2728 - A wsdl:binding in a DESCRIPTION that omits the use attribute on a contained - soapbind:fault element MUST be interpreted as though use="literal" had been + A wsdl:binding in a DESCRIPTION that omits the use attribute on a contained + soapbind:fault element MUST be interpreted as though use="literal" had been specified. =head2 R2724 - If an INSTANCE receives a message that is inconsistent with its WSDL - description, it SHOULD generate a soap:Fault with a faultcode of "Client", + If an INSTANCE receives a message that is inconsistent with its WSDL + description, it SHOULD generate a soap:Fault with a faultcode of "Client", unless a "MustUnderstand" or "VersionMismatch" fault is generated. =head2 R2725 - If an INSTANCE receives a message that is inconsistent with its WSDL - description, it MUST check for "VersionMismatch", "MustUnderstand" and - "Client" fault conditions in that order. + If an INSTANCE receives a message that is inconsistent with its WSDL + description, it MUST check for "VersionMismatch", "MustUnderstand" and + "Client" fault conditions in that order. =head2 R2729 - A MESSAGE described with an rpc-literal binding that is a response message - MUST have a wrapper element whose name is the corresponding wsdl:operation + A MESSAGE described with an rpc-literal binding that is a response message + MUST have a wrapper element whose name is the corresponding wsdl:operation name suffixed with the string "Response". =head2 R2735 - A MESSAGE described with an rpc-literal binding MUST place the part accessor + A MESSAGE described with an rpc-literal binding MUST place the part accessor elements for parameters and return value in no namespace. =head2 R2737 - A MESSAGE described with an rpc-literal binding MUST namespace qualify the + A MESSAGE described with an rpc-literal binding MUST namespace qualify the children of part accessor elements for the parameters and the return value with the targetNamespace in which their types are defined. =head2 R2738 - A MESSAGE MUST include all soapbind:headers specified on a wsdl:input or + A MESSAGE MUST include all soapbind:headers specified on a wsdl:input or wsdl:output of a wsdl:operation of a wsdl:binding that describes it. =head2 R2739 - A MESSAGE MAY contain SOAP header blocks that are not described in the + A MESSAGE MAY contain SOAP header blocks that are not described in the wsdl:binding that describes it. =head2 R2753 - A MESSAGE containing SOAP header blocks that are not described in the - appropriate wsdl:binding MAY have the mustUnderstand attribute on such SOAP - header blocks set to '1'. + A MESSAGE containing SOAP header blocks that are not described in the + appropriate wsdl:binding MAY have the mustUnderstand attribute on such SOAP + header blocks set to '1'. =head2 R2751 - The order of soapbind:header elements in soapbind:binding sections of a - DESCRIPTION MUST be considered independent of the order of SOAP header blocks + The order of soapbind:header elements in soapbind:binding sections of a + DESCRIPTION MUST be considered independent of the order of SOAP header blocks in the message. =head2 R2752 - A MESSAGE MAY contain more than one instance of each SOAP header block for - each soapbind:header element in the appropriate child of soapbind:binding in - the corresponding description. + A MESSAGE MAY contain more than one instance of each SOAP header block for + each soapbind:header element in the appropriate child of soapbind:binding in + the corresponding description. =head2 R2801 - A DESCRIPTION MUST use XML Schema 1.0 Recommendation as the basis of user - defined datatypes and structures. + A DESCRIPTION MUST use XML Schema 1.0 Recommendation as the basis of user + defined datatypes and structures. =head2 R3100 - REGDATA of type uddi:bindingTemplate representing a conformant INSTANCE MUST + REGDATA of type uddi:bindingTemplate representing a conformant INSTANCE MUST contain the uddi:accessPoint element. =head2 R3002 - REGDATA of type uddi:tModel representing a conformant Web service type MUST + REGDATA of type uddi:tModel representing a conformant Web service type MUST use WSDL as the description language. =head2 R3003 - REGDATA of type uddi:tModel representing a conformant Web service type MUST be + REGDATA of type uddi:tModel representing a conformant Web service type MUST be categorized using the uddi:types taxonomy and a categorization of "wsdlSpec". =head2 R3010 - REGDATA of type uddi:tModel representing a conformant Web service type MUST + REGDATA of type uddi:tModel representing a conformant Web service type MUST follow V1.08 of the UDDI Best Practice for Using WSDL in a UDDI Registry. =head2 R3011 - The wsdl:binding that is referenced by REGDATA of type uddi:tModel MUST itself + The wsdl:binding that is referenced by REGDATA of type uddi:tModel MUST itself conform to the Profile. =head2 R5001 - If an INSTANCE requires the use of HTTPS, the location attribute of the - soapbind:address element in its wsdl:port description MUST be a URI whose - scheme is "https"; otherwise it MUST be a URI whose scheme is "http". + If an INSTANCE requires the use of HTTPS, the location attribute of the + soapbind:address element in its wsdl:port description MUST be a URI whose + scheme is "https"; otherwise it MUST be a URI whose scheme is "http". SOAP::WSDL has no means of generating WSDL definitions. -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -This file contains quotes from -L. To these +This file contains quotes from +L. To these quotes, the legal notice from the document source applies. Rest of this file: Copyright 2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR Martin Kutter Emartin.kutter fen-net.deE +=head1 REPOSITORY INFORMATION + + $Rev: 391 $ + $LastChangedBy: kutterma $ + $Id: WS_I.pod 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $ + =cut diff --git a/lib/SOAP/WSDL/Manual/XSD.pod b/lib/SOAP/WSDL/Manual/XSD.pod index 7a237c3..1bcb4b3 100644 --- a/lib/SOAP/WSDL/Manual/XSD.pod +++ b/lib/SOAP/WSDL/Manual/XSD.pod @@ -6,76 +6,102 @@ SOAP::WSDL::Manual::XSD - SOAP::WSDL's XML Schema implementation =head1 DESCRIPTION -SOAP::WSDL's XML Schema implementation translates XML Schema definitions into +SOAP::WSDL's XML Schema implementation translates XML Schema definitions into perl classes. -Every top-level type or element in a XML schema is translated into a perl +Every top-level type or element in a XML schema is translated into a perl class (usually in it's own file). -Atomic types are either directly included in the class of their parent's +Atomic types are either directly included in the class of their parent's node, or as sub-package in their parent class' file. -While the implementation is still incomplete, it covers the XML schema +While the implementation is still incomplete, it covers the XML schema definitions used by most object mappers. =head1 USAGE -You can use SOAP::WSDL::XSD based classes just like any perl class - you may +You can use SOAP::WSDL::XSD based classes just like any perl class - you may instantiate it, inherit from it etc. -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 +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 like using the blessed hash ref as data storage won't work. -Moreover, most classes override Class::Std's default constructor for speed - -you should not expect BUILD or START methods to work, unless you call them -yourself (or define a new constructor). +Moreover, most all SOAP::WSDL::XSD::Typelib based classes override +Class::Std's default constructor for speed - you should not expect BUILD or +START methods to work, unless you call them yourself (or define a new +constructor). -All SOAP::WSDL::XSD based complexType classes allow a hash ref mathing their -data structure as only parameter to new(). You may mix hash and list refs and -objects in the structure passed to new - as long as the structure matches, it +All SOAP::WSDL::XSD based complexType classes allow a hash ref matching their +data structure as only parameter to new(). You may mix hash and list refs and +objects in the structure passed to new - as long as the structure matches, it 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. +All SOAP::WSDL::XSD based classes overload arrayification - that is being +accessed as a list ref - with a method returning [ $self ]. + +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 - +see L +for details. + +To iterate over a (potential) list of child elements just do the following: + + if (defined $obj->get_ELEMENT()) { + for (@{ $obj->get_ELEMENT() }) { + ... + } + } + +This is especially useful in mini-languages like +L, where you could say + + <%IF_DEFINED obj.get_ELEMENT %> + <%LOOP obj.get_ELEMENT %> + ... + <%/LOOP> + <%IF%> + =head1 HOW IT WORKS =head2 Base classes -SOAP::WSDL::XSD provides a set of base classes for the construction of XML +SOAP::WSDL::XSD provides a set of base classes for the construction of XML schema defined type classes. -=head3 Builtin types +=head3 Builtin types SOAP::WSDL::XSD provides classes for all builtin XML Schema datatypes. -For a list and reference on these classes, see +For a list and reference on these classes, see SOAP::WSDL::XSD::Typelib::Builtin. =head3 Derivation classes -For derivation by list, the list derivation class +For derivation by list, the list derivation class SOAP::WSDL::XSD::Typelib::Builtin::list exists. Derivation by restriction is handled without the help of additional classes. =head3 Element construction class -For the construction of element classes, the element superclass -SOAP::WSDL::XSD::Typelib::Element exists. All elements are ultimately derived -from this class. Elements may inherit from type classes, too - see +For the construction of element classes, the element superclass +SOAP::WSDL::XSD::Typelib::Element exists. All elements are ultimately derived +from this class. Elements may inherit from type classes, too - see L for details. =head3 complexType construction class -For the construction of complexType classes, the construction class -SOAP::WSDL::XSD::Typelib::ComplexType is provided. It provides a __factory -method for placing attributes in generated classes, and generating +For the construction of complexType classes, the construction class +SOAP::WSDL::XSD::Typelib::ComplexType is provided. It provides a __factory +method for placing attributes in generated classes, and generating appropriate setter/getter accessors. -The setters are special: They handle complex data structures of any type -(meaning hash refs, list refs and objects, and any combination of them), as +The setters are special: They handle complex data structures of any type +(meaning hash refs, list refs and objects, and any combination of them), as long as their structure matches the expected structure. =head1 TRANSLATION RULES @@ -86,72 +112,72 @@ TODO add more elaborate description =head3 element with type attribute -Elements defined by referencing a builtin or user defined type inherit +Elements defined by referencing a builtin or user defined type inherit from SOAP::WSDL::XSD::Typelib::Element and from the corresponding type class. - Element Type + Element Type base class class ^ ^ | | - ------------ + ------------ | - Element type="" class - + Element type="" class + =head3 element with ref attribute -Elements defined by referencing another element inherit from the +Elements defined by referencing another element inherit from the corresponding element class. referenced Element class ^ | - Element ref="" class + Element ref="" class =head3 element with atomic simpleType -Elements defined by a atomic simpleType from +Elements defined by a atomic simpleType from SOAP::WSDL::XSD::Typelib::Element and from the base type of the atomic type. - Element atomic Type + Element atomic Type base class base class ^ ^ | | - -------------- + -------------- | - element simpleType class + element simpleType class =head3 element with atomic complexType -Elements defined with a atomic complexType inherit from -SOAP::WSDL::XSD::Typelib::Element and from +Elements defined with a atomic complexType inherit from +SOAP::WSDL::XSD::Typelib::Element and from SOAP::WSDL::XSD::Typelib::ComplexType. Element complexType base class base class ^ ^ | | - -------------- + -------------- | - element complexType class + element complexType class =head2 complexType TODO add more elaborate description -Some content models are not implemented yet. The content models +Some content models are not implemented yet. The content models implemented are described below. =head3 complexType with "all" variety -Complex types with "all" variety inherit from -SOAP::WSDL::XSD::Typelib::ComplexType, and call it's factory method for +Complex types with "all" variety inherit from +SOAP::WSDL::XSD::Typelib::ComplexType, and call it's factory method for creating fields and accessors/mutators for the complexType's elements. -All element's type classes are loaded. Complex type classes have a "has a" +All element's type classes are loaded. Complex type classes have a "has a" relationship to their element fields. -Element fields may either be element classes (for element ref="") or type -classes (for element type=""). No extra element classes are created for +Element fields may either be element classes (for element ref="") or type +classes (for element type=""). No extra element classes are created for a complexType's elements. complexType @@ -163,8 +189,8 @@ a complexType's elements. element name="a" ------------> Element or type class object element name="b" ------------> Element or type class object -The implementation for all does enforce the order of elements as described -in the WSDL, even though this is not required by the XML Schema +The implementation for all does enforce the order of elements as described +in the WSDL, even though this is not required by the XML Schema specification. =head3 complexType with "sequence" variety @@ -173,43 +199,43 @@ The implementation of the "sequence" variety is the same as for all. =head3 complexType with "choice" variety -The implementation for choice currently is the same as for all - which means, -no check for occurence are made. +The implementation for choice currently is the same as for all - which means, +no check for occurrence are made. =head3 complexType with complexContent content model -Note that complexType classes with complexContent content model don't exhibit -their type via the xsi:type attribute yet, so they currently cannot be used +Note that complexType classes with complexContent content model don't exhibit +their type via the xsi:type attribute yet, so they currently cannot be used as a replacement for their base type. -SOAP::WSDL's XSD deserializer backend does not recognize the xsi:type="" +SOAP::WSDL's XSD deserializer backend does not recognize the xsi:type="" attribute either yet. =over =item * restriction variety -ComplexType classes with restriction variety inherit from their base type. +ComplexType classes with restriction variety inherit from their base type. No additional processing or content checking is performed yet. complexType base type class ^ | - complexType + complexType restriction =item * extension variety -ComplexType classes with extension variety inherit from the XSD base -complexType class and from their base type. +ComplexType classes with extension variety inherit from the XSD base +complexType class and from their base type. -Extension classes are checked for (re-)defining all elements of their parent +Extension classes are checked for (re-)defining all elements of their parent class. -Note that a derived type's elements (=properties) overrides the getter / -setter methods for all inherited elements. All object data is stored in the -derived type's class, not in the defining class (See L for a +Note that a derived type's elements (=properties) overrides the getter / +setter methods for all inherited elements. All object data is stored in the +derived type's class, not in the defining class (See L for a discussion on inside out object data storage). No additional processing or content checking is performed yet. @@ -220,7 +246,7 @@ No additional processing or content checking is performed yet. | | ----------------- | - complexType + complexType extension =back @@ -229,36 +255,60 @@ No additional processing or content checking is performed yet. TODO add more elaborate description -Some derivation methods are not implemented yet. The derivation methods +Some derivation methods are not implemented yet. The derivation methods implemented are described below. =head3 Derivation by list -Derivation by list is implemented by inheriting from both the base type and +Derivation by list is implemented by inheriting from both the base type and SOAP::WSDL::XSD::Typelib::XSD::list. =head3 Derivation by restriction -Derivation by restriction is implemented by inheriting from a base type and +Derivation by restriction is implemented by inheriting from a base type and applying the required restrictions. =head1 FACETS XML Schema facets are not implemented yet. -They will probably implemented some day by putting constant methods into +They will probably implemented some day by putting constant methods into the correspondent classes. =head1 ATTRIBUTES -XML attributes are not implemented yet. If you have a good idea on how to +XML attributes are not implemented yet. If you have a good idea on how to implement them, feel free to email me a proposal. +=head1 CAVEATS + +=over + +=item * START and BUILD are not being called + +In contrast to "normal" Class::Std based objects, the classes of the +SOAP::WSDL::XSD::Typelib:: hierarchy (and all type and element classes +generated by SOAP::WSDL) override Class::Std's constructor for performance +reasons. + +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 +at the top of you code: + + use Class::Std::Storable; + +In this case, Class::Std::Storable will export a new() method into your class, +which in turn calls START and BUILD. + +The constructors of all SOAP::WSDL::XSD::Typelib:: classes don't ! + +=back + =head1 BUGS AND LIMITATIONS The following XML Schema declaration elements are not supported yet: -=over +=over =item * Declaration elements @@ -293,10 +343,10 @@ The following XML Schema declaration elements are not supported yet: =back -The following XML Schema declaration elements are supported, but have no +The following XML Schema declaration elements are supported, but have no effect yet: -=over +=over =item * Factes @@ -323,11 +373,19 @@ effect yet: Copyright 2007 Martin Kutter. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR Martin Kutter Emartin.kutter fen-net.deE +=head1 REPOSITORY INFORMATION + + $Rev: 390 $ + $LastChangedBy: kutterma $ + $Id: Client.pm 390 2007-11-16 22:18:32Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $ + =cut + diff --git a/lib/SOAP/WSDL/Operation.pm b/lib/SOAP/WSDL/Operation.pm index 68cfd1f..accd994 100644 --- a/lib/SOAP/WSDL/Operation.pm +++ b/lib/SOAP/WSDL/Operation.pm @@ -2,7 +2,7 @@ package SOAP::WSDL::Operation; use strict; use warnings; use Class::Std::Storable; -use base qw/SOAP::WSDL::Base/; +use base qw(SOAP::WSDL::Base); my %operation_of :ATTR(:name :default<()>); my %input_of :ATTR(:name :default<[]>); diff --git a/lib/SOAP/WSDL/Part.pm b/lib/SOAP/WSDL/Part.pm index d319607..82396bd 100644 --- a/lib/SOAP/WSDL/Part.pm +++ b/lib/SOAP/WSDL/Part.pm @@ -22,11 +22,11 @@ sub serialize if ($item_name = $self->get_type() ) { # resolve type my ($prefix, $localname) = split /:/ , $item_name, 2; - my $type = $typelib->find_type( $ns_map{ $prefix }, $localname ) + my $type = $typelib->find_type( $ns_map{ $prefix }, $localname) or die "type $item_name , $ns_map{ $prefix } not found"; - + my $name = $self->get_name(); - return $type->serialize( $name, $data->{ $name }, $opt ); + return $type->serialize( $name, $data->{ $name }, $opt ); } elsif ( $item_name = $self->get_element() ) { my ($prefix, $localname) = split /:/ , $item_name, 2; diff --git a/lib/SOAP/WSDL/PortType.pm b/lib/SOAP/WSDL/PortType.pm index 20a0e6b..aa3c1f8 100644 --- a/lib/SOAP/WSDL/PortType.pm +++ b/lib/SOAP/WSDL/PortType.pm @@ -15,7 +15,7 @@ my %attributes_of :ATTR(); # Function factory - we could be writing this method for all %attribute # keys, too, but that's just C&P (eehm, Copy & Paste...) foreach my $method(keys %attributes_of ) { - no strict qw/refs/; + no strict qw(refs); ## no critic ProhibitNoStrict # ... btw, we mean this method here... *{ "find_$method" } = sub { diff --git a/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm b/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm index a76568d..83bfbdd 100644 --- a/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm +++ b/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm @@ -24,13 +24,13 @@ __PACKAGE__->_factory( faultcode => \%faultcode_of, faultstring => \%faultstring_of, faultactor => \%faultactor_of, - detail => \%detail_of, + detail => \%detail_of, }, { faultcode => 'SOAP::WSDL::XSD::Typelib::Builtin::QName', faultstring => 'SOAP::WSDL::XSD::Typelib::Builtin::string', faultactor => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI', - detail => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType', + detail => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType', } ); @@ -58,7 +58,7 @@ SOAP::WSDL::SOAP::Typelib::Fault11 - SOAP 1.1 Fault class Models a SOAP 1.1 Fault. -SOAP::WSDL::SOAP::Typelib::Fault11 objects are false in boolean context +SOAP::WSDL::SOAP::Typelib::Fault11 objects are false in boolean context and serialize to XML on stringification. This means you can do something like: @@ -88,15 +88,23 @@ Getter/setter for object's the faultactor property. Getter/setter for detail object's detail property. -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -Copyright 2007 Martin Kutter. +Copyright 2007 Martin Kutter. All rights reserved. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR Martin Kutter Emartin.kutter fen-net.deE +=head1 REPOSITORY INFORMATION + + $Rev: 391 $ + $LastChangedBy: kutterma $ + $Id: Fault11.pm 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm $ + =cut + diff --git a/lib/SOAP/WSDL/Serializer/XSD.pm b/lib/SOAP/WSDL/Serializer/XSD.pm index e259dc6..5eb332d 100644 --- a/lib/SOAP/WSDL/Serializer/XSD.pm +++ b/lib/SOAP/WSDL/Serializer/XSD.pm @@ -4,15 +4,15 @@ use strict; use warnings; use Class::Std::Storable; -our $VERSION='2.00_21'; +our $VERSION='2.00_24'; my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/'; my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance'; sub serialize { my ($self, $args_of_ref) = @_; - - my $opt = $args_of_ref->{ options }; + + my $opt = $args_of_ref->{ options }; if (not $opt->{ namespace }->{ $SOAP_NS }) { @@ -44,10 +44,10 @@ sub serialize { sub serialize_header { my ($self, $name, $data, $opt) = @_; - + # header is optional. Leave out if there's no header data return q{} if not $data; - return join ( q{}, + return join ( q{}, "<$opt->{ namespace }->{ $SOAP_NS }\:Header>", "$data", "{ namespace }->{ $SOAP_NS }\:Header>", @@ -57,11 +57,66 @@ sub serialize_header { sub serialize_body { my ($self, $name, $data, $opt) = @_; - # Body is NOT optional. Serialize to empty body + # Body is NOT optional. Serialize to empty body # if we have no data. - return join ( q{}, + return join ( q{}, "<$opt->{ namespace }->{ $SOAP_NS }\:Body>", defined $data ? "$data" : (), "{ namespace }->{ $SOAP_NS }\:Body>", ); } + +__END__ + +=pod + +=head1 NAME + +SOAP:WSDL::Serializer::XSD - Serializer for SOAP::WSDL::XSD::Typelib:: objects + +=head1 DESCRIPTION + +This is the default serializer for SOAP::WSDL::Client and Interface classes +generated by SOAP::WSDL + +It may be used as a template for creating custom serializers. + +See L for +details on that. + +=head1 METHODS + +=head2 serialize + +Creates a SOAP envelope based on the body and header arguments passed. + +Sets SOAP namespaces. + +=head2 serialize_body + +Serializes a message body to XML + +=head2 serialize_header + +Serializes a message header to XML + +=head1 LICENSE AND COPYRIGHT + +Copyright (c) 2007 Martin Kutter. All rights reserved. + +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself + +=head1 AUTHOR + +Martin Kutter Emartin.kutter fen-net.deE + +=head1 REPOSITORY INFORMATION + + $Rev: 391 $ + $LastChangedBy: kutterma $ + $Id: XSD.pm 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $ + +=cut + diff --git a/lib/SOAP/WSDL/Transport/HTTP.pm b/lib/SOAP/WSDL/Transport/HTTP.pm index 486e830..ebd5d7e 100644 --- a/lib/SOAP/WSDL/Transport/HTTP.pm +++ b/lib/SOAP/WSDL/Transport/HTTP.pm @@ -6,7 +6,7 @@ use base qw(LWP::UserAgent); SUBFACTORY: { no strict qw(refs); foreach my $method ( qw(code message status is_success) ) { - *{ $method } = sub { + *{ $method } = sub { my $self = shift; return $self->{ $method } if not @_; return $self->{ $method } = shift; @@ -19,8 +19,8 @@ sub send_receive { my ($envelope, $soap_action, $endpoint, $encoding, $content_type) = @parameters{qw(envelope action endpoint encoding content_type)}; - $encoding = defined($encoding) - ? 'utf8' + $encoding = defined($encoding) + ? 'utf8' : lc($encoding); # what's this all about? @@ -40,7 +40,7 @@ sub send_receive { # use bytes is lexically scoped my $bytelength = do { use bytes; length $envelope }; - $envelope = pack('C0A*', $envelope) + $envelope = pack('C0A*', $envelope) if length($envelope) != $bytelength; my $request = HTTP::Request->new( 'POST', @@ -50,15 +50,15 @@ sub send_receive { 'SOAPAction', $soap_action, ], $envelope ); - + my $response = $self->request( $request ); $self->code( $response->code); $self->message( $response->message); $self->is_success($response->is_success); $self->status($response->status_line); - - return $response->content(); + + return $response->content(); } 1; @@ -71,14 +71,14 @@ SOAP::WSDL::Transport::HTTP - Fallback http(s) transport class =head1 DESCRIPTION -Provides a thin transport class used by SOAP::WSDL::Transport when +Provides a thin transport class used by SOAP::WSDL::Transport when SOAP::Lite is not available. -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -Copyright 2004-2007 Martin Kutter. +Copyright (c) 2007 Martin Kutter. All rights reserved. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR @@ -87,9 +87,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 288 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - $Id: HTTP.pm 288 2007-09-29 19:34:20Z kutterma $ + $Id: HTTP.pm 391 2007-11-17 21:56:13Z kutterma $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Transport/HTTP.pm $ =cut diff --git a/lib/SOAP/WSDL/Transport/Loopback.pm b/lib/SOAP/WSDL/Transport/Loopback.pm index 9b8313a..b411e88 100644 --- a/lib/SOAP/WSDL/Transport/Loopback.pm +++ b/lib/SOAP/WSDL/Transport/Loopback.pm @@ -4,23 +4,23 @@ use warnings; use Class::Std::Storable; use SOAP::WSDL::Factory::Transport; -our $VERSION = '2.00_17'; +our $VERSION = '2.00_17'; SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ ); SOAP::WSDL::Factory::Transport->register( https => __PACKAGE__ ); -my %code_of :ATTR(:name :default<()>); -my %status_of :ATTR(:name :default<()>); -my %message_of :ATTR(:name :default<()>); -my %is_success_of :ATTR(:name :default<()>); +my %code_of :ATTR(:name :default<()>); +my %status_of :ATTR(:name :default<()>); +my %message_of :ATTR(:name :default<()>); +my %is_success_of :ATTR(:name :default<()>); { no warnings qw(redefine); - + sub new { my $class = shift; return bless \my ($o), $class; - } + } } # create methods normally inherited from SOAP::Client @@ -53,18 +53,18 @@ SOAP::WSDL::Transport::Test - Loopback transport class for SOAP::WSDL =head1 DESCRIPTION -SOAP::WSDL::Transport::Loopback is a loopback test transport backend for -SOAP::WSDL. +SOAP::WSDL::Transport::Loopback is a loopback test transport backend for +SOAP::WSDL. -When SOAP::WSDL::Transport::Loopback is used as transport backend, the -request is returned as response. No data ever goes over the wire. +When SOAP::WSDL::Transport::Loopback is used as transport backend, the +request is returned as response. No data ever goes over the wire. This is particularly useful for testing SOAP::WSDL plugins and applications. -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -Copyright 2004-2007 Martin Kutter. +Copyright (c) 2007 Martin Kutter. All rights reserved. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR diff --git a/lib/SOAP/WSDL/Transport/Test.pm b/lib/SOAP/WSDL/Transport/Test.pm index dd59ed9..9b135b9 100644 --- a/lib/SOAP/WSDL/Transport/Test.pm +++ b/lib/SOAP/WSDL/Transport/Test.pm @@ -4,7 +4,7 @@ use warnings; use Class::Std::Storable; use SOAP::WSDL::Factory::Transport; -our $VERSION = '2.00_14'; +our $VERSION = '2.00_14'; SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ ); SOAP::WSDL::Factory::Transport->register( https => __PACKAGE__ ); @@ -32,27 +32,27 @@ sub send_receive { $filename =~s{ \A(:?'|") }{}xms; $filename =~s{ (:?'|")\z }{}xms; $filename =~s{ \A [^:]+ : (:? /{2})? }{}xms; - + $filename = join '/', $base_dir_of{ ident $self }, "$filename.xml"; - if (not -r $filename) { + if (not -r $filename) { warn "cannot access $filename"; $self->set_code( 500 ); $self->set_message( "Failed" ); $self->set_is_success(0); $self->set_status("500 Failed"); - return; + return; } - + open my $fh, '<', $filename or die "cannot open $filename: $!"; binmode $fh; my $response = <$fh>; - close $fh or die "cannot close $filename: $!"; - + close $fh or die "cannot close $filename: $!"; + $self->set_code( 200 ); $self->set_message( "OK" ); $self->set_is_success(1); - $self->set_status("200 OK"); + $self->set_status("200 OK"); return $response; } @@ -73,21 +73,21 @@ SOAP::WSDL::Transport::Test - Test transport class for SOAP::WSDL =head1 DESCRIPTION -SOAP::WSDL::Transport::Test is a file-based test transport backend for -SOAP::WSDL. +SOAP::WSDL::Transport::Test is a file-based test transport backend for +SOAP::WSDL. -When SOAP::WSDL::Transport::Test is used as transport backend, the reponse is -read from a XML file and the request message is discarded. This is particularly -useful for testing SOAP::WSDL plugins. +When SOAP::WSDL::Transport::Test is used as transport backend, the reponse is +read from a XML file and the request message is discarded. This is +particularly useful for testing SOAP::WSDL plugins. =head2 Filename resolution -SOAP::WSDL::Transport makes up the response XML file name from the SOAPAction +SOAP::WSDL::Transport makes up the response XML file name from the SOAPAction of the request. The following filename is used: base_dir / soap_action .xml -The protocol scheme (e.g. http:) and two heading slashes (//) are stripped from +The protocol scheme (e.g. http:) and two heading slashes (//) are stripped from the soap_action. base_dir defaults to '.' @@ -105,14 +105,14 @@ Examples: =head2 set_base_dir -Sets the base directory SOAP::WSDL::Transport::Test should look for response +Sets the base directory SOAP::WSDL::Transport::Test should look for response files. -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -Copyright 2004-2007 Martin Kutter. +Copyright (c) 2007 Martin Kutter. All rights reserved. -This file is part of SOAP-WSDL. You may distribute/modify it under +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR diff --git a/lib/SOAP/WSDL/TypeLookup.pm b/lib/SOAP/WSDL/TypeLookup.pm index ced216a..9e47086 100644 --- a/lib/SOAP/WSDL/TypeLookup.pm +++ b/lib/SOAP/WSDL/TypeLookup.pm @@ -1,4 +1,6 @@ package SOAP::WSDL::TypeLookup; +use strict; +use warnings; my %TYPES = ( # wsdl: @@ -100,7 +102,7 @@ my %TYPES = ( }, notation => { type => 'SKIP', # not implemented yet - }, + }, annotation => { type => 'SKIP', # not implemented yet }, @@ -144,7 +146,7 @@ my %TYPES = ( type => 'METHOD', method => 'set_list', }, - union => { + union => { type => 'METHOD', method => 'set_union', }, @@ -157,7 +159,7 @@ my %TYPES = ( method => 'set_flavor', value => 'group', }, - all => { + all => { type => 'METHOD', method => 'set_flavor', value => 'all', @@ -175,10 +177,11 @@ my %TYPES = ( }, ); - sub lookup { - my $self = shift; - my $namespace = shift || 'http://schemas.xmlsoap.org/wsdl/'; - my $name = shift; - return $TYPES{ $namespace }->{ $name }; + my $self = shift; + my $namespace = shift || 'http://schemas.xmlsoap.org/wsdl/'; + my $name = shift; + return $TYPES{ $namespace }->{ $name }; } + +1; \ No newline at end of file diff --git a/lib/SOAP/WSDL/XSD/Builtin.pm b/lib/SOAP/WSDL/XSD/Builtin.pm index 1325dd8..be745cd 100644 --- a/lib/SOAP/WSDL/XSD/Builtin.pm +++ b/lib/SOAP/WSDL/XSD/Builtin.pm @@ -9,7 +9,7 @@ sub serialize { my $xml; $opt->{ indent } ||= ""; $opt->{ attributes } ||= []; - + $xml .= $opt->{ indent } if ($opt->{ readable }); $xml .= '<' . join ' ', $name, @{ $opt->{ attributes } }; if ( $opt->{ autotype }) { @@ -20,7 +20,7 @@ sub serialize { . $self->get_name() . '"' if ($self->get_name() ); } - if (defined $value) { + if (defined $value) { $xml .= '>'; $xml .= "$value"; $xml .= '' ; diff --git a/lib/SOAP/WSDL/XSD/ComplexType.pm b/lib/SOAP/WSDL/XSD/ComplexType.pm index f0c17e7..f2d99c8 100644 --- a/lib/SOAP/WSDL/XSD/ComplexType.pm +++ b/lib/SOAP/WSDL/XSD/ComplexType.pm @@ -53,9 +53,9 @@ sub set_extension { } sub init { - my $self = shift; - my @args = @_; - $self->SUPER::init( @args ); + my $self = shift; + my @args = @_; + $self->SUPER::init( @args ); } sub serialize { @@ -70,12 +70,12 @@ sub serialize { if ( $opt->{ qualify } ) { $opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ]; delete $opt->{ qualify }; - } + } $xml .= join q{ } , "<$name" , @{ $opt->{ attributes } }; delete $opt->{ attributes }; # don't propagate... - + if ( $opt->{ autotype }) { my $ns = $self->get_targetNamespace(); my $prefix = $opt->{ namespace }->{ $ns } @@ -84,32 +84,31 @@ sub serialize { if ($self->get_name() ); } $xml .= '>'; - $xml .= "\n" if ( $opt->{ readable } ); # add linebreak - if ( ($flavor eq "sequence") or ($flavor eq "all") ) - { + $xml .= "\n" if ( $opt->{ readable } ); # add linebreak + if ( ($flavor eq "sequence") or ($flavor eq "all") ) { $opt->{ indent } .= "\t"; for my $element (@{ $self->get_element() }) { # might be list - listify $value = [ $value ] if not ref $value eq 'ARRAY'; for my $single_value (@{ $value }) { - my $element_value; - if (blessed $single_value) { + my $element_value; + if (blessed $single_value) { my $method = 'get_' . $element->get_name(); - $element_value = $single_value->$method(); + $element_value = $single_value->$method(); } - else { + else { $element_value = $single_value->{ $element->get_name() }; } - $element_value = [ $element_value ] + $element_value = [ $element_value ] if not ref $element_value eq 'ARRAY'; - $xml .= join q{} - , map { $element->serialize( undef, $_, $opt ) } - @{ $element_value }; + $xml .= join q{} + , map { $element->serialize( undef, $_, $opt ) } + @{ $element_value }; } } - $opt->{ indent } =~s/\t$//; + $opt->{ indent } =~s/\t$//; } else { die "sorry, we just handle all and sequence types yet..."; diff --git a/lib/SOAP/WSDL/XSD/Element.pm b/lib/SOAP/WSDL/XSD/Element.pm index 00810b8..befb1af 100644 --- a/lib/SOAP/WSDL/XSD/Element.pm +++ b/lib/SOAP/WSDL/XSD/Element.pm @@ -57,7 +57,7 @@ sub serialize { if ( $opt->{ qualify } ) { $opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ]; - } + } # set default and fixed - fixed overrides everything, @@ -93,9 +93,9 @@ sub serialize { # lookup type my ($prefix, $localname) = split /:/ , $self->get_type(); my $ns = $ns_map{ $prefix }; - $type = $typelib->find_type( - $ns, $localname - ); + $type = $typelib->find_type( + $ns, $localname + ); # safety check die "no type for $prefix:$localname $ns_map{$prefix}" if (not $type); @@ -105,4 +105,3 @@ sub serialize { 1; - diff --git a/lib/SOAP/WSDL/XSD/Schema/Builtin.pm b/lib/SOAP/WSDL/XSD/Schema/Builtin.pm index a797910..19950fd 100644 --- a/lib/SOAP/WSDL/XSD/Schema/Builtin.pm +++ b/lib/SOAP/WSDL/XSD/Schema/Builtin.pm @@ -8,55 +8,90 @@ use base qw(SOAP::WSDL::XSD::Schema); # all builtin types - add validation (e.g. content restrictions) later... my %BUILTINS = ( - 'string' => {}, - 'boolean' => {}, - 'decimal' => {}, - 'dateTime' => {}, - 'float' => {}, - 'double' => {}, - 'duration' => {}, - 'time' => {}, - 'date' => {}, - 'gYearMonth' => {}, - 'gYear' => {}, - 'gMonthDay' => {}, - 'gDay' => {}, - 'gMonth' => {}, - 'hexBinary' => {}, - 'base64Binary' => {}, - 'anyURI' => {}, - 'QName' => {}, - 'NOTATION' => {}, - 'integer' => {}, - 'nonPositiveInteger' => {}, - 'nonNegativeInteger' => {}, - 'positiveInteger' => {}, - 'negativeInteger' => {}, + 'string' => {}, + 'boolean' => {}, + 'decimal' => {}, + 'dateTime' => {}, + 'float' => {}, + 'double' => {}, + 'duration' => {}, + 'time' => {}, + 'date' => {}, + 'gYearMonth' => {}, + 'gYear' => {}, + 'gMonthDay' => {}, + 'gDay' => {}, + 'gMonth' => {}, + 'hexBinary' => {}, + 'base64Binary' => {}, + 'anyURI' => {}, + 'QName' => {}, + 'NOTATION' => {}, + 'integer' => {}, + 'nonPositiveInteger' => {}, + 'nonNegativeInteger' => {}, + 'positiveInteger' => {}, + 'negativeInteger' => {}, 'long' => {}, - 'int' => {}, - 'unsignedInt' => {}, - 'short' => {}, - 'unsignedShort' => {}, - 'byte' => {}, - 'unsignedByte' => {}, - 'normalizedString' => {}, - 'token' => {}, - 'NMTOKEN' => {}, + 'int' => {}, + 'unsignedInt' => {}, + 'short' => {}, + 'unsignedShort' => {}, + 'byte' => {}, + 'unsignedByte' => {}, + 'normalizedString' => {}, + 'token' => {}, + 'NMTOKEN' => {}, ); sub START { - my $self = shift; - my @args = @_; + my $self = shift; + my @args = @_; - while (my ($name, $value) = each %BUILTINS ) - { - $self->push_type( SOAP::WSDL::XSD::Builtin->new({ + while (my ($name, $value) = each %BUILTINS ) + { + $self->push_type( SOAP::WSDL::XSD::Builtin->new({ name => $name, targetNamespace => 'http://www.w3.org/2001/XMLSchema', } ) - ); - } + ); + } return $self; } 1; + + +=pod + +=head1 NAME + +SOAP:WSDL::XSD::Schema::Builtin - Provides builtin XML Schema datatypes for parsing WSDL + +=head1 DESCRIPTION + +Used internally by SOAP::WSDL's WSDL parser. + +See for +SOAP::WSDL::XSD's builtin XML Schema datatypes. + +=head1 LICENSE AND COPYRIGHT + +Copyright (c) 2007 Martin Kutter. All rights reserved. + +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself + +=head1 AUTHOR + +Martin Kutter Emartin.kutter fen-net.deE + +=head1 REPOSITORY INFORMATION + + $Rev: 391 $ + $LastChangedBy: kutterma $ + $Id: Builtin.pm 391 2007-11-17 21:56:13Z kutterma $ + $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Schema/Builtin.pm $ + +=cut + diff --git a/lib/SOAP/WSDL/XSD/SimpleType.pm b/lib/SOAP/WSDL/XSD/SimpleType.pm index 69f1ae4..fc740c3 100644 --- a/lib/SOAP/WSDL/XSD/SimpleType.pm +++ b/lib/SOAP/WSDL/XSD/SimpleType.pm @@ -61,10 +61,10 @@ sub serialize { my $value = shift; my $opt = shift; my $ident = ident $self; - + $opt->{ attributes } ||= []; $opt->{ indent } ||= q{}; - + return $self->_serialize_single($name, $value , $opt) if ( $flavor_of{ $ident } eq 'restriction' or $flavor_of{ $ident } eq 'union' @@ -81,7 +81,7 @@ sub serialize { sub _serialize_single { my ($self, $name, $value, $opt) = @_; my $xml = ''; - $xml .= $opt->{ indent } if ($opt->{ readable }); # add indentation + $xml .= $opt->{ indent } if ($opt->{ readable }); # add indentation $xml .= '<' . join ' ', $name, @{ $opt->{ attributes } }; if ( $opt->{ autotype }) { my $ns = $self->get_targetNamespace(); @@ -89,10 +89,10 @@ sub _serialize_single { || die 'No prefix found for namespace '. $ns; $xml .= ' type="' . $prefix . ':' . $self->get_name() .'"'; } - + # nillabel ? return $xml .'/>' if not defined $value; - + $xml .= join q{}, '>' , $value , ''; $xml .= "\n" if ($opt->{ readable }); return $xml; diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin.pm index 37ba550..b1bdbae 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin.pm @@ -64,19 +64,21 @@ SOAP::WSDL::XSD::Typelib::Builtin - Built-in XML Schema datatypes =head1 DESCRIPTION -This module implements all builtin Types from the XML schema specification. +The SOAP::WSDL::XSD::Typelib::Builtin hierarchy implements all builtin types +from the XML schema specification. -Objects of a class may be filled with values and serialize correctly. +All XML schema derived types inherit from +SOAP::WSDL::XSD::Typelib::Builtin::anyType. These basic type classes are most useful when used as element or simpleType base classes. -The datatypes classes themselves are split up into -SOAP::WSDL::XSD::Typelib::Builtin::* modules. - -Using SOAP::WSDL::XSD::Typelib::Builtin uses all of the builtin datatype +Using SOAP::WSDL::XSD::Typelib::Builtin uses all of the builtin datatype classes. +All builtin types feature common behaviour described below in +L + =head1 EXAMPLES my $bool = SOAP::WSDL::XSD::Typelib::Builtin::bool->new({ value => 0} ); @@ -88,7 +90,7 @@ classes. package MySimpleType; use SOAP::WSDL::XSD::Typelib::Builtin; use SOAP::WSDL::XSD::Typelib::SimpleType; - + use base qw(SOAP::WSDL::XSD::Typelib::SimpleType SOAP::WSDL::XSD::Typelib::Builtin::list SOAP::WSDL::XSD::Typelib::Builtin::string @@ -177,6 +179,36 @@ The boolean class returns 0 or 1 in numeric context. decimal, float and double (and derived classes) return their value in numeric context. +=item * arrayification (@{}) + +When accessed as a list ref, objects of all classes return a list ref with +the object itself as single element. + +This is most useful for writing loops without additional conversions, +especially in mini-languages found in templating systems or the like, which +may not natively support converting to list refs. + +Instead of writing something like + + my $value = $complexType->get_ELEMENT; + $value = ref $value eq 'ARRAY' ? $value : [ $value ]; + for (@{ $value }) { ... } + +you can just write + + for (@{ $complexType->get_ELEMENT }) {...} + +Note that complexTypes with undef elements still return undef when accessing +an undefined element, so when an element may be empty you still have to write +something like: + + my $value = $complexType->get_ELEMENT(); + if (defined $value) { + for (@{ $value }) { + ... + } + } + =back =head1 Subclasses @@ -205,14 +237,14 @@ Returns true/false in boolean context. Returns 1 / 0 in numeric context. -boolean objects have a special method for deleteing their value, because +boolean objects have a special method for deleteing their value, because calling C results in the value being set to false. $obj->delete_value(); -=head2 SOAP::WSDL::XSD::Typelib::Builtin::byte +=head2 SOAP::WSDL::XSD::Typelib::Builtin::byte -byte integer objects. +byte integer objects. =head2 SOAP::WSDL::XSD::Typelib::Builtin::date @@ -222,12 +254,12 @@ date values are automatically converted into XML date strings during setting: The time zone is set to the local time zone if not included. -All input variants supported by Date::Parse are supported. You may even pass -in dateTime strings - the time part will be ignored. Note that +All input variants supported by Date::Parse are supported. You may even pass +in dateTime strings - the time part will be ignored. Note that set_value is around 100 times slower when setting non-XML-time strings -When setting dates before the beginning of the epoch (negative UNIX timestamp), -you should use the XML date string format for setting dates. The behaviour of +When setting dates before the beginning of the epoch (negative UNIX timestamp), +you should use the XML date string format for setting dates. The behaviour of Date::Parse for dates before the epoch is system dependent. =head2 SOAP::WSDL::XSD::Typelib::Builtin::dateTime @@ -236,19 +268,19 @@ dateTime values are automatically converted into XML dateTime strings during set YYYY-MM-DDThh:mm:ss.nnnnnnn+zz:zz -The fraction of seconds (nnnnnnn) part is optional. Fractions of seconds may +The fraction of seconds (nnnnnnn) part is optional. Fractions of seconds may be given with arbitrary precision The fraction of seconds part is excluded in converted values, as it would always be 0. -All input variants supported by Date::Parse are supported. Note that +All input variants supported by Date::Parse are supported. Note that set_value is around 100 times slower when setting non-XML-time strings =head2 SOAP::WSDL::XSD::Typelib::Builtin::decimal decimal is the base of all non-float numbers -=head2 SOAP::WSDL::XSD::Typelib::Builtin::double +=head2 SOAP::WSDL::XSD::Typelib::Builtin::double =head2 SOAP::WSDL::XSD::Typelib::Builtin::duration @@ -300,8 +332,8 @@ Derived by SOAP::WSDL::XSD::Typelib::Builtin::list. =head2 SOAP::WSDL::XSD::Typelib::Builtin::normalizedString -Tab, newline and carriage return characters are replaced by whitespace in -set_value. +Tab, newline and carriage return characters are replaced by whitespace in +set_value. =head2 SOAP::WSDL::XSD::Typelib::Builtin::NOTATION @@ -313,7 +345,7 @@ set_value. =head2 SOAP::WSDL::XSD::Typelib::Builtin::string -String values are XML-escaped on serialization. +String values are XML-escaped on serialization. The following characters are escaped: <, >, & @@ -324,12 +356,12 @@ time values are automatically converted into XML time strings during setting: hh:mm:ss.nnnnnnn+zz:zz hh:mm:ss+zz:zz -The time zone is set to the local time zone if not included. The optional +The time zone is set to the local time zone if not included. The optional nanoseconds part is not included in converted values, as it would always be 0. -All input variants supported by Date::Parse are supported. You may even pass -in dateTime strings - the date part will be ignored. Note that -set_value is around 100 times slower when setting non-XML-time strings +All input variants supported by Date::Parse are supported. You may even pass +in dateTime strings - the date part will be ignored. Note that +set_value is around 100 times slower when setting non-XML-time strings. =head2 SOAP::WSDL::XSD::Typelib::Builtin::token @@ -347,10 +379,10 @@ set_value is around 100 times slower when setting non-XML-time strings =item * set_value -In contrast to Class::Std-generated mutators (setters), set_value does +In contrast to Class::Std-generated mutators (setters), set_value does not return the last value. -This is for speed reasons: SOAP::WSDL never needs to know the last value +This is for speed reasons: SOAP::WSDL never needs to know the last value when calling set_calue, but calls it over and over again... =back diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm index b6b7a71..6c1a941 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm index bf2b3d2..6781354 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm index cf5aa40..a1f3409 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm index be69856..63c9978 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm @@ -11,9 +11,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm index ade8eb1..a67f2fc 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm index 0eb8257..901bf16 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm index 34a8ac9..2a8afa6 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm index c184676..7b0941b 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm @@ -16,10 +16,10 @@ sub set_value { $value_of{ ident $_[0] } = $_[1] } # use $_[n] for speed. # This is less readable, but notably faster. # -# use postfix-if for speed. This is slightly faster, as it saves +# use postfix-if for speed. This is slightly faster, as it saves # perl from creating a pad (variable context). # -# The methods below may get called zillions of times, so +# The methods below may get called zillions of times, so # every little statement matters... sub serialize { @@ -29,7 +29,7 @@ sub serialize { return join q{} , $_[0]->start_tag($_[1], $value_of{ $ident }) , $value_of{ $ident } - , $_[0]->end_tag($_[1]); + , $_[0]->end_tag($_[1]); } sub as_bool :BOOLIFY { diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm index 87f7d63..e678557 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm @@ -6,14 +6,14 @@ use Class::Std::Storable; sub get_xmlns { 'http://www.w3.org/2001/XMLSchema' }; # use $_[1] for performance -sub start_tag { +sub start_tag { my $opt = $_[1] ||= {}; return '<' . $opt->{name} . ' >' if $opt->{ name }; return q{} } # use $_[1] for performance -sub end_tag { +sub end_tag { return $_[1] && defined $_[1]->{ name } ? "{name} >" : q{}; @@ -25,6 +25,10 @@ sub serialize_qualified :STRINGIFY { return $_[0]->serialize( { qualified => 1 } ); } +sub as_list :ARRAYIFY { + return [ $_[0] ]; +} + Class::Std::initialize(); # make :STRINGIFY overloading serializable 1; diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm index 0e92d6c..e7fd592 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm index 665b509..b9f508f 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm @@ -11,9 +11,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) @@ -24,8 +24,8 @@ BEGIN { } -# XML Schema facets. We don't know how to implement them yet, but they're -# her, just in case you wanted to know. +# XML Schema facets. We don't know how to implement them yet, but they're +# here, just in case you wanted to know. #my %length_of :ATTR(:name :default<()>); #my %minLength_of :ATTR(:name :default<()>); #my %maxLength_of :ATTR(:name :default<()>); diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm index 9012125..441853b 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm @@ -15,9 +15,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm index a40a03e..bd02c4a 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm index 7efdc05..1452948 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm @@ -13,9 +13,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) @@ -30,25 +30,25 @@ sub set_value { # use set_value from base class if we have a XML-DateTime format #2037-12-31+01:00 if ( - $_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2} + $_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2} (:? [\+\-] \d{2} \: \d{2} )$ - }xms + }xms ) { $_[0]->SUPER::set_value($_[1]) } - # converting a date is hard work: It needs a timezone, because - # 2007-12-30+12:00 and 2007-12-31-12:00 mean the same day - just in + # converting a date is hard work: It needs a timezone, because + # 2007-12-30+12:00 and 2007-12-31-12:00 mean the same day - just in # different locations. - # strftime actually prints out the correct date, but always prints the + # strftime actually prints out the correct date, but always prints the # local timezone with %z. - # So, if our timezone is not 0, we strftime it without timezone and + # So, if our timezone is not 0, we strftime it without timezone and # append it by hand by the following formula: # The timezone hours are the int (timesone seconds / 3600) - # The timezone minutes (if someone ever specifies something like that) - # are int( (seconds % 3600) / 60 ) + # The timezone minutes (if someone ever specifies something like that) + # are int( (seconds % 3600) / 60 ) # say, int( (seconds modulo 3600) / 60 ) # - # If we have no timezone (meaning the timezone is + # If we have no timezone (meaning the timezone is else { # strptime sets empty values to undef - and strftime doesn't like that... my @time_from = strptime($_[1]); @@ -57,9 +57,9 @@ sub set_value { # use Data::Dumper; # warn Dumper \@time_from, sprintf('%+03d%02d', $time_from[6] / 3600, $time_from[6] % 60 ); my $time_str = defined $time_zone_seconds - ? strftime( '%Y-%m-%d', @time_from ) + ? strftime( '%Y-%m-%d', @time_from ) . sprintf('%+03d%02d', int($time_from[6] / 3600), int ( ($time_from[6] % 3600) / 60 ) ) - : do { + : do { strftime( '%Y-%m-%d%z', @time_from ); }; substr $time_str, -2, 0, ':'; diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm index 8f4de99..f33950b 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm @@ -7,8 +7,8 @@ use Date::Parse; use Date::Format; -# XML Schema facets. We don't know how to implement them yet, but they're -# her, just in case you wanted to know. +# XML Schema facets. We don't know how to implement them yet, but they're +# here, just in case you wanted to know. # #my %pattern_of :ATTR(:name :default<()>); #my %enumeration_of :ATTR(:name :default<()>); @@ -26,9 +26,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) @@ -43,17 +43,17 @@ sub set_value { #2037-12-31T00:00:00.0000000+01:00 return if not $_[1]; return $_[0]->SUPER::set_value($_[1]) if ( - $_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2} + $_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2} T \d{2} \: \d{2} \: \d{2} (:? \. \d{1,7} )? [\+\-] \d{2} \: \d{2} $ - }xms + }xms ); - + # strptime sets empty values to undef - and strftime doesn't like that... my @time_from = map { ! defined $_ ? 0 : $_ } strptime($_[1]); return if not (@time_from); undef $time_from[$#time_from]; - + my $time_str = strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from ); substr $time_str, -2, 0, ':'; $_[0]->SUPER::set_value($time_str); diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm index bd54628..e92586a 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm index 470a42b..3c305aa 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm index 3d404c3..e2b20cd 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm @@ -9,9 +9,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm index 409074e..f273c2b 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm index ba2ea59..7441f46 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm index 8813e01..0814c12 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm index 93cc1ab..bfbc759 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm index c72973c..4f6495d 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm index f55e32b..130843b 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm @@ -9,9 +9,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm index b6f528d..bbd5166 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm index fb7854a..723deb5 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm index 462ec49..31e7929 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm index 3a86abf..4ccedbb 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm index 2d89805..8642ddf 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm @@ -25,13 +25,15 @@ SOAP::WSDL::XSD::Typelib::Builtin::list - list derivation base class =head1 DESCRIPTION To derive from some class by list, just inherit from list. - -Make sure SOAP::WSDL::XSD::Typelib::Builtin::list is before the type + +Make sure SOAP::WSDL::XSD::Typelib::Builtin::list is before the type to derive from in the @ISA list. -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -This file is part of SOAP-WSDL. You may distribute/modify it under +Copyright (c) 2007 Martin Kutter. All rights reserved. + +This file is part of SOAP-WSDL. You may distribute/modify it under the same terms as perl itself =head1 AUTHOR diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm index 592fcf8..b1b78bd 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm index 36b23e4..b58bbb4 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm index 5c70dcc..8471345 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm index 067eff4..a2e8485 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm index 55e7b15..8b55acf 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm index a41058e..a86247a 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm index 0b58e25..ea53f35 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm index 8aa289f..3973952 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) @@ -35,7 +35,7 @@ sub serialize { my ($self, $opt) = @_; my $ident = ident $self; $opt ||= {}; - my $value = $self->get_value();; + my $value = $self->get_value(); return $self->start_tag({ %{ $opt }, nil => 1}) if not defined $value; diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm index d9383bb..74b5cbf 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm @@ -14,9 +14,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) @@ -32,7 +32,7 @@ sub set_value { if ( $_[1] =~ m{ ^ \d{2} \: \d{2} \: \d{2} (:? \. \d{1,7} )? [\+\-] \d{2} \: \d{2} $ - }xms + }xms ) { $_[0]->SUPER::set_value($_[1]) } @@ -43,13 +43,13 @@ sub set_value { else { # strptime sets empty values to undef - and strftime doesn't like that... # we even need to set it to 1 to prevent a "Day '0' out of range 1..31" warning.. - - # we need to set the current date for correct TZ conversion - + + # we need to set the current date for correct TZ conversion - # could be daylight savings time my @now = localtime; - my @time_from = map { my $alternative = shift @now; - ! defined $_ - ? $alternative + my @time_from = map { my $alternative = shift @now; + ! defined $_ + ? $alternative : $_ } strptime($_[1]); undef $time_from[-1]; my $time_str = strftime( '%H:%M:%S%z', @time_from ); diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm index e3b045b..e5eacb4 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm @@ -6,13 +6,13 @@ use warnings; BEGIN { use Class::Std::Storable; use base qw(SOAP::WSDL::XSD::Typelib::Builtin::normalizedString); - + no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm index e7f8659..e80132a 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm index 07720e7..886f471 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm index 893ba77..13b43a9 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm @@ -10,9 +10,9 @@ BEGIN { no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm b/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm index 024f0e3..d6cb66f 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm @@ -6,13 +6,13 @@ use warnings; BEGIN { use Class::Std::Storable; use base qw(SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt); - + no warnings qw(redefine); no strict qw(refs); - # Yes, I know it's ugly - but this is the fastest constructor to write + # Yes, I know it's ugly - but this is the fastest constructor to write # for Class::Std-Style inside out objects.. - *{ __PACKAGE__ . '::new' } = sub { + *{ __PACKAGE__ . '::new' } = sub { my $self = bless \do { my $foo } , shift; if (@_) { $self->set_value( $_[0]->{ value } ) diff --git a/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm b/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm index 51b934b..171eb2f 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm @@ -9,7 +9,7 @@ use Class::Std::Storable; use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType); -our $VERSION = '2.00_23'; +our $VERSION = '2.00_24'; my %ELEMENTS_FROM; my %ATTRIBUTES_OF; @@ -28,10 +28,10 @@ sub STORABLE_thaw_post {} # for error reporting. Eases working with data objects... sub AUTOMETHOD { my ($self, $ident, @args_from) = @_; - - my $class = ref $self || $self; + + my $class = ref $self || $self or die "Cannot call AUTOMETHOD as function"; confess "Can't locate object method \"$_\" via package \"$class\". \n" - . "Valid methods are: " + . "Valid methods are: " . join(', ', map { ("get_$_" , "set_$_") } keys %{ $ATTRIBUTES_OF{ $class } }) . "\n" } @@ -45,73 +45,73 @@ sub _factory { $CLASSES_OF{ $class } = shift; no strict qw(refs); - no warnings qw(redefine); + no warnings qw(redefine); while (my ($name, $attribute_ref) = each %{ $ATTRIBUTES_OF{ $class } } ) { my $type = $CLASSES_OF{ $class }->{ $name } or croak "No class given for $name"; # require all types here $type->isa('UNIVERSAL') - or eval "require $type" + or eval "require $type" or croak $@; # check now, so we don't need to do it later. - # $is_list is used in the methods created. Filling it now means - # we don't have to check it every time the method is called, but - # can just use $is_list, which will hold the value assigned to + # $is_list is used in the methods created. Filling it now means + # we don't have to check it every time the method is called, but + # can just use $is_list, which will hold the value assigned to # it when the method was created. my $is_list = $type->isa('SOAP::WSDL::XSD::Typelib::Builtin::list'); - - # The set_$name method below looks rather weird, + + # The set_$name method below looks rather weird, # but is optimized for performance. # - # We could use sub calls for sure, but these are much slower. And + # We could use sub calls for sure, but these are much slower. And # the logic is not that easy: # # we accept: # a) objects - # b) scalars + # b) scalars # c) list refs # d) hash refs - # e) mixed stuff of all of the above, so we have to set our child to + # e) mixed stuff of all of the above, so we have to set our child to # a) value if it's an object # b) New object of expected class with value for simple values # c 1) New object with value for list values and list type - # c 2) List ref of new objects with value for list values and + # c 2) List ref of new objects with value for list values and # non-list type - # c + e 1) List ref of objects for list values (list of objects) + # c + e 1) List ref of objects for list values (list of objects) # and non-list type - # c + e 2) List ref of new objects for list values (list of hashes) - # and non-list type where the hash ref is passed to new as - # argument + # c + e 2) List ref of new objects for list values (list of hashes) + # and non-list type where the hash ref is passed to new as + # argument # d) New object with values passed to new for HASH references # # We throw an error on - # a) list refs of list refs - don't know what to do with this (maybe + # a) list refs of list refs - don't know what to do with this (maybe # use for lists of list types ?) # b) wrong object types - # c) non-blessed non-ARRAY/HASH references - if you can define semantics + # c) non-blessed non-ARRAY/HASH references - if you can define semantics # for GLOB or SCALAR references, feel free to add them. - # d) we should also die for non-blessed non-ARRAY/HASH references in - # lists but don't do yet - oh my ! - - *{ "$class\::set_$name" } = sub { + # d) we should also die for non-blessed non-ARRAY/HASH references in + # lists but don't do yet - oh my ! + + *{ "$class\::set_$name" } = sub { my $is_ref = ref $_[1]; - $attribute_ref->{ ident $_[0] } = ($is_ref) - ? ($is_ref eq 'ARRAY') - ? $is_list # remembered from outside closure + $attribute_ref->{ ident $_[0] } = ($is_ref) + ? ($is_ref eq 'ARRAY') + ? $is_list # remembered from outside closure ? $type->new({ value => $_[1] }) # it's a list element - can take list ref as value : [ map { # it's not a list element - set value to list of objects - ref $_ + ref $_ ? ref $_ eq 'HASH' ? $type->new($_) : ref $_ eq $type ? $_ : croak "cannot use " . ref($_) . " reference as value for $name - $type required" : $type->new({ value => $_ }) - } @{ $_[1] } + } @{ $_[1] } ] - : $is_ref eq 'HASH' + : $is_ref eq 'HASH' ? $type->new( $_[1] ) # neither ARRAY nor HASH - probably an object... @@ -121,21 +121,21 @@ sub _factory { # not $is_ref : $type->new({ value => $_[1] }); - return; + return; }; *{ "$class\::add_$name" } = sub { my $ident = ident $_[0]; - warn "attempting to add empty value to " . ref $_[0] + warn "attempting to add empty value to " . ref $_[0] if not defined $_[1]; - + # first call # test for existance, not for definedness if (not exists $attribute_ref->{ $ident }) { $attribute_ref->{ $ident } = $_[1]; return; } - + if (not ref $attribute_ref->{ $ident } eq 'ARRAY') { # second call: listify previous value if it's no list and add current $attribute_ref->{ $ident } = [ $attribute_ref->{ $ident }, $_[1] ]; @@ -144,10 +144,10 @@ sub _factory { # second and following: add to list push @{ $attribute_ref->{ $ident } }, $_[1]; - return; + return; }; - - # TODO: remove this alias - we don't use it, and it's pretty much + + # TODO: remove this alias - we don't use it, and it's pretty much # misleading... *{ "$class\::$name" } = *{ "$class\::add_$name" }; } @@ -161,20 +161,20 @@ sub _factory { # my ($self, $ident, $args_of) = @_; # # The hanging side comment show you what would be there, then. - - # iterate over keys of arguments + + # iterate over keys of arguments # and call set appropriate field in clase - map { ($ATTRIBUTES_OF{ $class }->{ $_ }) + map { ($ATTRIBUTES_OF{ $class }->{ $_ }) ? do { my $method = "set_$_"; $self->$method( $_[1]->{ $_ } ); # ( $args_of->{ $_ } ); } : $_ =~ m{ \A # beginning of string - xmlns # xmlns - }xms + xmlns # xmlns + }xms ? do {} - : do { use Data::Dumper; - croak "unknown field $_ in $class. Valid fields are:\n" + : do { use Data::Dumper; + croak "unknown field $_ in $class. Valid fields are:\n" . join(', ', @{ $ELEMENTS_FROM{ $class } }) . "\n" . "Structure given:\n" . Dumper @_ }; } keys %{ $_[1] }; # %$args_of; @@ -191,7 +191,7 @@ sub _factory { # return concatenated return value of serialize call of all # 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 }; # do we have some content @@ -199,38 +199,38 @@ sub _factory { $element = [ $element ] if not ref $element eq 'ARRAY'; my $name = $_; - + map { # serialize element elements with their own serializer # but name them like they're named here. if ( $_->isa( 'SOAP::WSDL::XSD::Typelib::Element' ) ) { $_->serialize( { name => $name } ); } - # serialize complextype elments (of other types) with their + # serialize complextype elments (of other types) with their # serializer, but add element tags around. else { join q{}, $_->start_tag({ name => $name }) , $_->serialize() - , $_->end_tag({ name => $name }); + , $_->end_tag({ name => $name }); } } @{ $element } } else { q{}; - } + } } (@{ $ELEMENTS_FROM{ $class } }); }; *{ "$class\::serialize" } = sub { $_[1] ||= {}; # maybe even replace by assigning a constant var - - # do we have a empty element ? + + # do we have a empty element ? return $_[0]->start_tag({ %{ $_[1] }, empty => 1 }) if not defined $ELEMENTS_FROM{ $class } or not @{ $ELEMENTS_FROM{ $class } }; return join q{}, $_[0]->start_tag($_[1]), $_[0]->_serialize(), $_[0]->end_tag(); } - + } 1; @@ -252,7 +252,7 @@ To subclass, write a package like this: use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); # we only need the :get attribute qualifier. - # set and init_arg are automatically created by + # set and init_arg are automatically created by # SOAP::WSDL::XSD::Typelib::ComplexType my %first_attr_of :ATTR(:get :default<()>); my %second_attr_of :ATTR(:get :default<()>); @@ -274,12 +274,12 @@ To subclass, write a package like this: second_attr => 'My::SecondElement', third_attr => 'My::ThirdElement', ); - - # call _factory + + # call _factory __PACKAGE__->_factory( \@elements_from, \%attributes_of, - \%classes_of + \%classes_of, ); 1; @@ -288,7 +288,7 @@ When subclassing, the following methods are created in the subclass: =head2 new -Constructor. For your convenience, new will accept data for the object's +Constructor. For your convenience, new will accept data for the object's properties in the following forms: hash refs @@ -296,22 +296,22 @@ properties in the following forms: 2) of list refs 3) of hash refs 4) of objects - 5) mixed stuff of all of the above + 5) mixed stuff of all of the above -new() will set the data via the set_FOO methods to the object's element -properties. +new() will set the data via the set_FOO methods to the object's element +properties. -Data passed to new must comply to the object's structure or new() will -complain. Objects passed must be of the expected type, or new() will +Data passed to new must comply to the object's structure or new() will +complain. Objects passed must be of the expected type, or new() will complain, too. Examples: - my $obj = MyClass->new({ MyName => $value }); + my $obj = MyClass->new({ MyName => $value }); my $obj = MyClass->new({ - MyName => { - DeepName => $value + MyName => { + DeepName => $value, }, MySecondName => $value, }); @@ -325,27 +325,27 @@ Examples: MyThirdName => [ $object1, $object2 ], }); -The new() method from Class::Std will be overridden, so you should not rely -on it's behaviour. +The new() method from Class::Std will be overridden, so you should not rely +on it's behaviour. -Your START and BUILD methods are called, but the class' inheritance tree is +Your START and BUILD methods are called, but the class' inheritance tree is not traversed. =head2 set_FOO -A mutator method for every element property. +A mutator method for every element property. -For your convenience, the set_FOO methods will accept all kind of data you -can think of (and all combinations of them) as input - with the exception +For your convenience, the set_FOO methods will accept all kind of data you +can think of (and all combinations of them) as input - with the exception of GLOBS and filehandles. -This means you may set element properties by passing +This means you may set element properties by passing a) objects - b) scalars + b) scalars c) list refs d) hash refs - e) mixed stuff of all of the above + e) mixed stuff of all of the above Examples are similar to the examples provided for new() above. @@ -362,7 +362,7 @@ Variants known to work are: sequence all complexContent containing sequence/all definitions - + =item * Thread safety SOAP::WSDL::XSD::Typelib::Builtin uses Class::Std::Storable which uses @@ -375,12 +375,12 @@ No facets are implemented yet. =back -=head1 LICENSE +=head1 LICENSE AND COPYRIGHT -Copyright 2004-2007 Martin Kutter. +Copyright (c) 2007 Martin Kutter. All rights reserved. -This file is part of SOAP-WSDL. You may distribute/modify it under -the same terms as perl itself +This file is part of SOAP-WSDL. You may distribute/modify it under +the same terms as perl itself. =head1 AUTHOR @@ -388,10 +388,10 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 346 $ + $Rev: 391 $ $LastChangedBy: kutterma $ - $Id: ComplexType.pm 346 2007-11-05 21:38:56Z kutterma $ + $Id: ComplexType.pm 391 2007-11-17 21:56:13Z kutterma $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $ - + =cut diff --git a/lib/SOAP/WSDL/XSD/Typelib/Element.pm b/lib/SOAP/WSDL/XSD/Typelib/Element.pm index bf0b511..c47e4fe 100644 --- a/lib/SOAP/WSDL/XSD/Typelib/Element.pm +++ b/lib/SOAP/WSDL/XSD/Typelib/Element.pm @@ -2,7 +2,7 @@ package SOAP::WSDL::XSD::Typelib::Element; use strict; -our $VERSION = '2.00_23'; +our $VERSION = '2.00_24'; my %NAME; my %NILLABLE; @@ -27,11 +27,11 @@ BLOCK: { no strict qw(refs); while (my ($name, $value) = each %method_lookup ) { *{ "__set$name" } = sub { - my $class = ref $_[0] || $_[0]; + my $class = ref $_[0] || $_[0] or die "Cannot call __set$name without parameter"; $value->{ $class } = $_[1]; }; *{ "__get$name" } = sub { - my $class = ref $_[0] || $_[0]; + my $class = ref $_[0] || $_[0] or die "Cannot call __get$name as function"; return $value->{ $class }; }; } @@ -43,7 +43,7 @@ sub start_tag { # my ($self, $opt, $value) = @_; my $ending = ($_[1]->{ empty }) ? '/>' : '>'; my @attr_from = (); - + if ($_[1]->{ nil }) { return q{} if not $NILLABLE{ ref $_[0] }; push @attr_from, 'xsi:nil="true"'; @@ -52,15 +52,15 @@ sub start_tag { if ($_[1]->{qualified}) { push @attr_from, 'xmlns="' . $_[0]->get_xmlns . '"'; } - - # 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 return join q{ }, "<$_[1]->{ name }" , @attr_from , $ending if $_[1]->{ name }; return join q{ }, "<$NAME{ ref $_[0]}" , @attr_from , $ending; } # use $_[0] and $_[1] for speed. -# +# # read it as: # # my ($self, $opt) = @_; @@ -68,11 +68,11 @@ sub start_tag { # return "{name}>" if $opt->{name}; # return ""; # -# 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 # end_tag. If we don't need to check, we can speed things up by defining # end tag with () prototype - perl will inline it for us if we do... sub end_tag { - return "{name}>" if $_[1]->{name}; + return "{name}>" if $_[1]->{name}; return ""; } @@ -120,10 +120,10 @@ Now we create this XML schema definition type class: __PACKAGE__->__set_name('MyElementName'); __PACKAGE__->__set_nillable(0); __PACKAGE__->__set_ref(1); - + =head1 NOTES -=over +=over =item * type="Foo" @@ -131,14 +131,14 @@ Implemented via inheritance. =item * ref="Foo" -Implemented via inheritance, too. Calling +Implemented via inheritance, too. Calling -__PACKAGE__->__set_ref(1) is highly encouraged, though it has no -effect yet - it will probably be needed for serialization to XML +__PACKAGE__->__set_ref(1) is highly encouraged, though it has no +effect yet - it will probably be needed for serialization to XML Schema definitions some day. =back - + =head1 BUGS AND LIMITATIONS =over diff --git a/t/002_parse_wsdl.t b/t/002_parse_wsdl.t index b5b54a7..32f7aa2 100644 --- a/t/002_parse_wsdl.t +++ b/t/002_parse_wsdl.t @@ -1,7 +1,7 @@ #!/usr/bin/perl -w use strict; use warnings; -use Test::More tests => 17; +use Test::More tests => 22; use lib '../lib'; eval { @@ -156,6 +156,21 @@ my $opt = { # ok $wsdl->explain($opt) =~ m/#optional/m; +eval { $wsdl->expand('hallo:welt')}; +like $@, qr{unbound}, 'Die on attempt to resolve unbound prefix'; + +my $complex = $types->find_type( 'urn:myNamespace', 'complex'); + +ok $complex->find_element('urn:myNamespace', 'length'), 'Find element in complexType'; +ok ! $complex->find_element('urn:myNamespace', 'FOO'), 'Find element in complexType'; + +eval { $complex->foo() }; +like $@, qr{ foo }xms; + +eval { SOAP::WSDL::ComplexType->foo() }; +like $@, qr{ foo }xms; + + sub skip_without_test_xml { skip("Test::XML not available", 1) if (not $Test::XML::VERSION); } diff --git a/t/097_kwalitee.t b/t/097_kwalitee.t new file mode 100644 index 0000000..ccff854 --- /dev/null +++ b/t/097_kwalitee.t @@ -0,0 +1,21 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use Test::More; +use English qw(-no_match_vars); + +if ( not $ENV{TEST_AUTHOR} ) { + my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.'; + plan( skip_all => $msg ); +} + +chdir '..' if -d ('../t'); + +eval 'use Test::Kwalitee'; + +if ( $EVAL_ERROR ) { + my $msg = 'Test::Kwalitee not installed; skipping'; + plan( skip_all => $msg ); +} diff --git a/t/099_pod_coverage.t b/t/099_pod_coverage.t new file mode 100644 index 0000000..e660c9b --- /dev/null +++ b/t/099_pod_coverage.t @@ -0,0 +1,58 @@ +use Test::More; + + +if ( not $ENV{TEST_AUTHOR} ) { + my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.'; + plan( skip_all => $msg ); +} + +eval "use Test::Pod::Coverage 1.00"; +plan skip_all => "Test::Pod::Coverage 1.00 required for testing POD" if $@; + +my @dirs = ( 'lib' ); +if (-d '../t/') { # we are inside t/ + @dirs = ('../lib'); +} +else { # we are outside t/ + # add ./lib to include path if blib/lib is not there (e.g. we're not + # run from Build test or the like) + push @INC, './lib' if not grep { $_ eq 'blib/lib' } @INC; +} + +# Don't test Builtin XSD types - they're undocumented on purpose +# Don't test WSDL datatypes - they're undocumented on purpose. +@files = grep { $_ !~m{ (SOAP::WSDL::XSD::Typelib::Builtin::.+ + |SOAP::WSDL::OpMessage + |SOAP::WSDL::Types + |SOAP::WSDL::PortType + |SOAP::WSDL::Port + |SOAP::WSDL::Service + |SOAP::WSDL::Binding + |SOAP::WSDL::Message + |SOAP::WSDL::TypeLookup + |SOAP::WSDL::Base + |SOAP::WSDL::Part + |SOAP::WSDL::Operation + |SOAP::WSDL::SOAP::[^:]+ + |SOAP::WSDL::XSD::SimpleType + |SOAP::WSDL::XSD::Element + |SOAP::WSDL::XSD::ComplexType + |SOAP::WSDL::XSD::Builtin + |SOAP::WSDL::XSD::Schema + + ) \z }xms; } all_modules( @dirs ); + +plan tests => scalar @files; +foreach (@files) { + pod_coverage_ok( $_ , + { + private => [ + qr/^_/, + qr/^BUILD$/, + qr/^START$/, + qr/^STORABLE/, + qr/^AUTOMETHOD$/, + qr/^DEMOLISH$/ + ] + }); +} \ No newline at end of file diff --git a/t/Expat/01_expat.t b/t/Expat/01_expat.t index 8da0a18..4242c5b 100644 --- a/t/Expat/01_expat.t +++ b/t/Expat/01_expat.t @@ -17,6 +17,7 @@ my $xml = q{ Test Test2 + }; my $parser = SOAP::WSDL::Expat::MessageParser->new({ @@ -37,6 +38,9 @@ BEGIN { 'MyAtomicComplexTypeElement' => 'MyAtomicComplexTypeElement', 'MyAtomicComplexTypeElement/test' => 'MyTestElement', 'MyAtomicComplexTypeElement/test2' => 'MyTestElement2', + 'MyAtomicComplexTypeElement/foo' => '__SKIP__', + 'MyAtomicComplexTypeElement/foo/bar' => 'MyFooElement', + 'MyAtomicComplexTypeElement/foo/baz' => 'MyFooElement', ); sub new { return bless {}, 'FakeResolver' }; diff --git a/t/SOAP/WSDL/03_complexType-element-ref.t b/t/SOAP/WSDL/03_complexType-element-ref.t index 33e6eae..bf18371 100644 --- a/t/SOAP/WSDL/03_complexType-element-ref.t +++ b/t/SOAP/WSDL/03_complexType-element-ref.t @@ -37,5 +37,5 @@ ok ($xml = $soap->call('test', } ), 'Serialized complexType' ); -is $xml, q{TestRefTest2} +like $xml, qr{TestRefTest2} , 'element ref="" serialization'; diff --git a/t/SOAP/WSDL/04_element.t b/t/SOAP/WSDL/04_element.t index 3c535fa..da6e0ab 100644 --- a/t/SOAP/WSDL/04_element.t +++ b/t/SOAP/WSDL/04_element.t @@ -44,8 +44,8 @@ ok ($xml = $soap->call('testRef', testElementRef => 'Test' ), 'Serialized (simple) element' ); -is $xml - , q{Test} +like $xml + , qr{Test} , 'element ref serialization result' ; diff --git a/t/SOAP/WSDL/Deserializer/Hash.t b/t/SOAP/WSDL/Deserializer/Hash.t index 82dcd79..7585a1b 100644 --- a/t/SOAP/WSDL/Deserializer/Hash.t +++ b/t/SOAP/WSDL/Deserializer/Hash.t @@ -1,4 +1,4 @@ -use Test::More tests => 11; +use Test::More tests => 13; use lib '../../../lib'; use_ok qw(SOAP::WSDL::Deserializer::Hash); @@ -13,9 +13,27 @@ is $data->{a}->{b}->[0], 1; is $data->{a}->{b}->[1], 2; is $data->{a}->{c}, 3; -ok $data = $deserializer->deserialize(q{12}); +# need 3 elements in array to trigger all branches... +# need ignorable whitespace to trigger removal... +ok $data = $deserializer->deserialize( +q{ + 1 + 2 + 3 +}); is $data->{a}->{b}->[0]->{c}, 1; is $data->{a}->{b}->[1]->{c}, 2; eval { $deserializer->deserialize('grzlmpfh') }; -ok $@->isa('SOAP::WSDL::SOAP::Typelib::Fault11'); \ No newline at end of file +ok $@->isa('SOAP::WSDL::SOAP::Typelib::Fault11'); + +my $fault = $deserializer->generate_fault({ + message => 'Foo', + code => 'Bar', + role => 'mine', +}); + +is $fault->get_faultstring(), 'Foo'; + +$fault = $deserializer->generate_fault({}); +is $fault->get_faultstring(), 'Unknown error'; diff --git a/t/SOAP/WSDL/Deserializer/SOM.t b/t/SOAP/WSDL/Deserializer/SOM.t index cfefed7..0fd4c47 100644 --- a/t/SOAP/WSDL/Deserializer/SOM.t +++ b/t/SOAP/WSDL/Deserializer/SOM.t @@ -1,5 +1,5 @@ use Test::More; -use SOAP::Lite; + eval { require SOAP::Lite; 1; } or do { plan skip_all => 'SOAP::Lite not available'; exit 0; diff --git a/t/SOAP/WSDL/Deserializer/XSD.t b/t/SOAP/WSDL/Deserializer/XSD.t index 16a710c..58200e8 100644 --- a/t/SOAP/WSDL/Deserializer/XSD.t +++ b/t/SOAP/WSDL/Deserializer/XSD.t @@ -1,6 +1,6 @@ use strict; use warnings; -use Test::More tests => 5; +use Test::More tests => 8; use SOAP::WSDL::Deserializer::XSD; @@ -16,4 +16,8 @@ my $fault = $obj->generate_fault(); is $fault->get_faultstring(), 'Unknown error'; is $fault->get_faultactor(), 'urn:localhost'; -is $fault->get_faultcode(), 'soap:Client'; \ No newline at end of file +is $fault->get_faultcode(), 'soap:Client'; + +isa_ok $obj->deserialize('rubbeldiekatz'), 'SOAP::WSDL::SOAP::Typelib::Fault11'; +isa_ok $obj->deserialize(''), 'SOAP::WSDL::SOAP::Typelib::Fault11'; +isa_ok $obj->deserialize(''), 'SOAP::WSDL::SOAP::Typelib::Fault11'; \ No newline at end of file diff --git a/t/SOAP/WSDL/Generator/XSD.t b/t/SOAP/WSDL/Generator/XSD.t index 453ae08..9597459 100644 --- a/t/SOAP/WSDL/Generator/XSD.t +++ b/t/SOAP/WSDL/Generator/XSD.t @@ -1,4 +1,4 @@ -use Test::More tests => 34; +use Test::More tests => 37; use File::Basename qw(dirname); use File::Spec; use File::Path; @@ -40,9 +40,10 @@ $generator->set_typemap_prefix('MyTypemaps'); $generator->set_interface_prefix('MyInterfaces'); $generator->set_output(undef); -$generator->generate_typelib(); -$generator->generate_typemap(); -$generator->generate_interface(); +$generator->generate(); +#$generator->generate_typelib(); +#$generator->generate_typemap(); +#$generator->generate_interface(); eval "use lib '$path/testlib'"; use_ok qw( MyInterfaces::testService::testPort ); @@ -122,6 +123,7 @@ ok eval { require MyTypes::testComplexTypeElementAtomicSimpleType; }; my $ct_east = MyTypes::testComplexTypeElementAtomicSimpleType->new({ testString => 'Just some test', testAtomicSimpleTypeElement => 42, + testAtomicSimpleTypeElement2 => 23, }); is $ct_east->get_testAtomicSimpleTypeElement, 42; @@ -129,4 +131,11 @@ is $ct_east->get_testAtomicSimpleTypeElement->get_value(), 42; isa_ok($ct_east->get_testAtomicSimpleTypeElement, 'MyTypes::testComplexTypeElementAtomicSimpleType::_testAtomicSimpleTypeElement'); + +is $ct_east->get_testAtomicSimpleTypeElement2, 23; +is $ct_east->get_testAtomicSimpleTypeElement2->get_value(), 23; +isa_ok($ct_east->get_testAtomicSimpleTypeElement2, + 'MyTypes::testComplexTypeElementAtomicSimpleType::_testAtomicSimpleTypeElement2'); + + rmtree "$path/testlib"; diff --git a/t/SOAP/WSDL/Transport/01_Test.t b/t/SOAP/WSDL/Transport/01_Test.t index e3647ef..b94af19 100644 --- a/t/SOAP/WSDL/Transport/01_Test.t +++ b/t/SOAP/WSDL/Transport/01_Test.t @@ -23,6 +23,7 @@ ok( $soap->get_transport->set_base_dir( join '/', $base_dir, 'acceptance' ) ); $soap->outputxml(1); $response = $soap->call({ operation => 'test', soap_action => 'http://test2' }, {}); is $response, 'test2', 'Returned file content'; + } SKIP: { diff --git a/t/SOAP/WSDL/XSD/Typelib/Builtin/boolean.t b/t/SOAP/WSDL/XSD/Typelib/Builtin/boolean.t index eaa07c6..f3af826 100644 --- a/t/SOAP/WSDL/XSD/Typelib/Builtin/boolean.t +++ b/t/SOAP/WSDL/XSD/Typelib/Builtin/boolean.t @@ -1,4 +1,4 @@ -use Test::More tests => 18; +use Test::More tests => 19; use strict; use warnings; use SOAP::WSDL::XSD::Typelib::Builtin::boolean; @@ -46,6 +46,7 @@ is "$bool", 'false', 'stringification'; ok $bool->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType'), 'inheritance'; is $bool->serialize({ name => 'test'}), 'false'; +is $bool->serialize(), 'false'; $bool->delete_value(); is "$bool", '', 'serialized undef to empty string'; \ No newline at end of file diff --git a/t/SOAP/WSDL/XSD/Typelib/Builtin/date.t b/t/SOAP/WSDL/XSD/Typelib/Builtin/date.t index 2b09b0b..61348e3 100644 --- a/t/SOAP/WSDL/XSD/Typelib/Builtin/date.t +++ b/t/SOAP/WSDL/XSD/Typelib/Builtin/date.t @@ -53,6 +53,12 @@ my %localized_date_of = ( ); +$obj = SOAP::WSDL::XSD::Typelib::Builtin::date->new(); +$obj = SOAP::WSDL::XSD::Typelib::Builtin::date->new({}); +$obj = SOAP::WSDL::XSD::Typelib::Builtin::date->new({ + value => '2007-12-31' +}); + while (my ($date, $converted) = each %localized_date_of ) { $obj = SOAP::WSDL::XSD::Typelib::Builtin::date->new(); diff --git a/t/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.t b/t/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.t index 9b8a4c4..a3d640a 100644 --- a/t/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.t +++ b/t/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.t @@ -22,6 +22,10 @@ my %dates = ( '30 Aug 2007' => '2007-08-30T00:00:00', ); +$obj = SOAP::WSDL::XSD::Typelib::Builtin::dateTime->new(); +$obj = SOAP::WSDL::XSD::Typelib::Builtin::dateTime->new({}); +$obj = SOAP::WSDL::XSD::Typelib::Builtin::dateTime->new({ value => '2007-08-31T00:32:00' }); + while (my ($date, $converted) = each %dates ) { $obj = SOAP::WSDL::XSD::Typelib::Builtin::dateTime->new(); diff --git a/t/SOAP/WSDL/XSD/Typelib/Builtin/language.t b/t/SOAP/WSDL/XSD/Typelib/Builtin/language.t new file mode 100644 index 0000000..9b5362c --- /dev/null +++ b/t/SOAP/WSDL/XSD/Typelib/Builtin/language.t @@ -0,0 +1,12 @@ +use Test::More tests => 5; +use strict; +use warnings; +use SOAP::WSDL::XSD::Typelib::Builtin::language; +my $Name = SOAP::WSDL::XSD::Typelib::Builtin::language->new(); +is $Name->get_value(), undef; +$Name = SOAP::WSDL::XSD::Typelib::Builtin::language->new({}); +is $Name->get_value(), undef; +ok $Name = SOAP::WSDL::XSD::Typelib::Builtin::language->new({ value => 'DE' }); +is "$Name", "DE", 'stringification'; + +ok $Name->isa('SOAP::WSDL::XSD::Typelib::Builtin::token'), 'inheritance'; \ No newline at end of file diff --git a/t/SOAP/WSDL/XSD/Typelib/Builtin/time.t b/t/SOAP/WSDL/XSD/Typelib/Builtin/time.t index 3dc82a2..82cb131 100644 --- a/t/SOAP/WSDL/XSD/Typelib/Builtin/time.t +++ b/t/SOAP/WSDL/XSD/Typelib/Builtin/time.t @@ -17,8 +17,11 @@ my $timezone = timezone; use_ok('SOAP::WSDL::XSD::Typelib::Builtin::time'); my $obj; +$obj = SOAP::WSDL::XSD::Typelib::Builtin::time->new({value => '12:23:33'}); +$obj = SOAP::WSDL::XSD::Typelib::Builtin::time->new({}); $obj = SOAP::WSDL::XSD::Typelib::Builtin::time->new(); + $obj->set_value( '12:23:03' ); is $obj->get_value() , "12:23:03$timezone", 'conversion'; diff --git a/t/SOAP/WSDL/XSD/Typelib/ComplexType.t b/t/SOAP/WSDL/XSD/Typelib/ComplexType.t new file mode 100644 index 0000000..eb7caac --- /dev/null +++ b/t/SOAP/WSDL/XSD/Typelib/ComplexType.t @@ -0,0 +1,216 @@ +use strict; +use warnings; + +package MyType; + +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +my %test_of :ATTR(:get); + +__PACKAGE__->_factory( +[ 'test' ], +{ + test => \%test_of, +}, +{ + test => 'SOAP::WSDL::XSD::Typelib::Builtin::string', +} +); + +package MyType2; + +use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); + +my %test2_of :ATTR(:get); + +__PACKAGE__->_factory( +[ 'test' ], +{ + test => \%test2_of, +}, +{ + test => 'MyType', +} +); + +package main; +use Test::More tests => 90; +use Data::Dumper; +use Storable; +my $obj; + +$obj = MyType->new({}); +isa_ok $obj, 'MyType'; +is $obj->get_test, undef, 'undefined element content'; + +$obj = MyType->new({ test => 'Test1'}); +isa_ok $obj, 'MyType'; +isa_ok $obj->get_test, 'SOAP::WSDL::XSD::Typelib::Builtin::string'; +is $obj->get_test, 'Test1', 'element content'; + +$obj = MyType->new({ + test => SOAP::WSDL::XSD::Typelib::Builtin::string->new({ + value => 'Test2' + }) +}); +isa_ok $obj, 'MyType'; +isa_ok $obj->get_test, 'SOAP::WSDL::XSD::Typelib::Builtin::string'; +is $obj->get_test, 'Test2', 'element content'; + +$obj = MyType->new({ + test => { value => 'Test2' } # just a trick - pass it unaltered to new... +}); +isa_ok $obj, 'MyType'; +isa_ok $obj->get_test, 'SOAP::WSDL::XSD::Typelib::Builtin::string'; +is $obj->get_test, 'Test2', 'element content'; + +$obj = MyType->new({ + test => [ + SOAP::WSDL::XSD::Typelib::Builtin::string->new({ + value => 'Test' + }), + + SOAP::WSDL::XSD::Typelib::Builtin::string->new({ + value => 'Test2' + }) + ], +}); +isa_ok $obj, 'MyType'; +isa_ok $obj->get_test, 'ARRAY'; +is $obj->get_test()->[0], 'Test', 'element content'; +is $obj->get_test()->[1], 'Test2', 'element content'; + +my $nested = MyType2->new({ + test => $obj, +}); + +is $nested->get_test, $obj; +$nested = MyType2->new({ + test => [$obj, $obj], +}); + +is $nested->get_test->[0], $obj; + +$nested = MyType2->new({ + test => { + test => [ + SOAP::WSDL::XSD::Typelib::Builtin::string->new({ + value => 'Test' + }), + + SOAP::WSDL::XSD::Typelib::Builtin::string->new({ + value => 'Test2' + }) + ], + }, +}); + +is $nested->get_test->[0], $obj; + +$obj = MyType->new(); +isa_ok $obj, 'MyType'; +is $obj->get_test, undef, 'undefined element content'; + +$obj->add_test( + SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'TestString0'}) +); + +is $obj->get_test, 'TestString0', 'added element content'; + +for my $count (1..5) { + $obj->add_test( + SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => "TestString$count" }) + ); + + is ref $obj->get_test(), 'ARRAY', 'element content structure'; + is @{ $obj->get_test() }, $count+1, "element list length: " . ($count + 1); + + for my $index (0..$count-1) { + is $obj->get_test->[$index], "TestString$index", "element content [$index]"; + } +} + +# TODO - remove after *{ "$class\::$name"" } methods are gone + +$obj = MyType->new(); + +isa_ok $obj, 'MyType'; +is $obj->get_test, undef; + +eval { my $foo = @{ $obj->get_test() } }; +like $@ , qr{Can't \s use \s an \s undefined}x, 'get_ELEMENT still undef on ARRAYIFY'; + +$obj->test( + SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'TestString0'}) +); + +is $obj->get_test, 'TestString0'; +eval { is @{ $obj->get_test() }, 1, 'ARRAYIFY get_ELEMENT' }; +fail 'cannot ARRAYIFY get_ELEMENT' if ($@); + +my @serialized = ( +'TestString0TestString1', +'TestString0TestString1TestString2', +'TestString0TestString1TestString2TestString3', +'TestString0TestString1TestString2TestString3TestString4', +'TestString0TestString1TestString2TestString3TestString4TestString5', +); + +for my $count (1..5) { + $obj->test( + SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => "TestString$count" }) + ); + + is ref $obj->get_test(), 'ARRAY'; + is @{ $obj->get_test() }, $count+1; + + for my $index (0..$count-1) { + is $obj->get_test->[$index], "TestString$index"; + } + is $obj->serialize(), $serialized[$count -1]; + +} + +eval { + $obj = MyType->new({ + test => [ + SOAP::WSDL::XSD::Typelib::Builtin::string->new({ + value => 'Test' + }), + + \&CORE::die, + ], + }); +}; +like $@, qr{cannot \s use \s CODE}xms; + +eval { + $obj = MyType->new({ + test => \&CORE::die, + }); +}; +like $@, qr{cannot \s use \s CODE}xms; + + +eval { $obj->set_FOO(42) }; +like $@, qr{Can't \s locate \s object \s method}x; + +eval { MyType->set_FOO(42) }; +like $@, qr{Can't \s locate \s object \s method}x; + +eval { MyType->new({ FOO => 42 }) }; +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() }; +like $@, qr{Cannot \s call}xm; + + +eval { SOAP::WSDL::XSD::Typelib::ComplexType->_factory([], { test => {} }, {}) }; +like $@, qr{ No \s class \s given \s for \s }xms; + +eval { SOAP::WSDL::XSD::Typelib::ComplexType->_factory([], { test => {} }, { test => 'HopeItDoesntExistOnYourSystem'}) }; +like $@, qr{ Can't \s locate \s HopeItDoesntExistOnYourSystem.pm }xms; + diff --git a/t/SOAP/WSDL/XSD/Typelib/Element.t b/t/SOAP/WSDL/XSD/Typelib/Element.t new file mode 100644 index 0000000..732195a --- /dev/null +++ b/t/SOAP/WSDL/XSD/Typelib/Element.t @@ -0,0 +1,44 @@ +use strict; +use warnings; + +package MyElement; +use base qw(SOAP::WSDL::XSD::Typelib::Element + SOAP::WSDL::XSD::Typelib::Builtin::string +); + +__PACKAGE__->__set_name('MyElement'); +__PACKAGE__->__set_nillable(1); + +package main; +use Test::More tests => 11; + +my $obj; + +# All constructor variants +$obj = MyElement->new(); +$obj = MyElement->new({}); +$obj = MyElement->new({ value => 'Test' }); + +is( MyElement->__get_nillable(), 1); +is $obj->__get_nillable, 1; +isa_ok $obj, 'MyElement'; +is $obj->get_value(), 'Test'; + +$obj->set_value(undef); +is $obj, ''; + +$obj->__set_nillable(0); +is $obj->__get_nillable(), 0; + +eval { SOAP::WSDL::XSD::Typelib::Element::__get_nillable() }; +like $@, qr{Cannot \s call}xms; +eval { SOAP::WSDL::XSD::Typelib::Element::__set_nillable() }; +like $@, qr{Cannot \s call}xms; + +is $obj->start_tag({empty => 1}), ''; +is $obj->start_tag({nil => 1}), '', 'empty string with nil option and NILLABLE false'; +$obj->set_value('Test'); + + +eval { is @{ $obj }, 1, 'ARRAYIFY' }; +fail 'ARRAYIFY' if ($@); \ No newline at end of file diff --git a/t/acceptance/wsdl/generator_test.wsdl b/t/acceptance/wsdl/generator_test.wsdl index a7a5925..1ee660e 100644 --- a/t/acceptance/wsdl/generator_test.wsdl +++ b/t/acceptance/wsdl/generator_test.wsdl @@ -182,6 +182,13 @@ + + + + + + +