diff --git a/Build.PL b/Build.PL index 5c84976..b6fe961 100644 --- a/Build.PL +++ b/Build.PL @@ -5,7 +5,7 @@ $build = Module::Build->new( create_makefile_pl => 'small', dist_abstract => 'SOAP with WSDL support', dist_name => 'SOAP-WSDL', - dist_version => '2.00.01', + dist_version => '2.00.02', module_name => 'SOAP::WSDL', license => 'artistic', requires => { @@ -22,7 +22,7 @@ $build = Module::Build->new( 'Getopt::Long' => 0, 'List::Util' => 0, 'LWP::UserAgent' => 0, - 'Template' => 0, + 'Template' => q(2.18), 'Term::ReadKey' => 0, 'URI' => 0, 'XML::Parser::Expat' => 0, @@ -41,7 +41,7 @@ $build = Module::Build->new( 'File::Spec' => 0, 'Storable' => 0, 'Test::More' => 0, - 'Template' => 0, + 'Template' => q(2.18), 'XML::Parser::Expat' => 0, }, recursive_test_files => 1, diff --git a/Changes b/Changes index f8c3b68..af04e5a 100644 --- a/Changes +++ b/Changes @@ -1,4 +1,4 @@ -Release notes for SOAP::WSDL 2.00.01 +Release notes for SOAP::WSDL 2.00.02 ------- I'm proud to present a new release of SOAP::WSDL. @@ -36,6 +36,30 @@ Features: The following changes have been made: +2.00.02 - May 16 2008 + +The following features were added (the numbers in square brackets are the +tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): + + * [ 1941134 ] Server for mod_perl2. Thanks to Noah Robin for contributing. + (I actually forgot to include it in 2.00.01) + +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/). + + * [ 1943667 ] Error parsing complexType/extension + * [ 1960650 ] multi-level inheritance of complexTypes fails + * [ 1960319 ] ComplexType as_hash_ref returns objects on maximum depth + * [ 1943673 ] Relative schemaLocation="" URLs not resolved in + * [ 1953598 ] Cannot set server and attribute prefixes with wsdl2perl + * [ 1941080 ] 017_generator.t (test 2) fails with Template-Toolkit 2.15 + * [ 1949209 ] spelling/grammar in Mod_Perl2.pm + * [ 1950670 ] on_action removed in SOAP::WSDL >= 2.00 + * #35346 element ref="" not handled properly + +The following uncategorized improvements have been made: + 2.00.01 The following features were added (the numbers in square brackets are the diff --git a/LICENSE b/LICENSE index fd6bcd3..2785c8f 100644 --- a/LICENSE +++ b/LICENSE @@ -2,6 +2,145 @@ SOAP::WSDL is dual licensed under the same terms as Perl itself. This means at your choice, either the Perl Artistic License, or -the GNU GPL version 1 or higher. +the GNU GPL version 1 or - at your choice - any higher version. + +The GNU GPL can be obtained from +http://www.gnu.org/licenses/old-licenses/gpl-1.0.txt + +Newer versions can be found at http://www.gnu.org/licenses/gpl.html + +The Artistic License can be obtained from +http://dev.perl.org/licenses/artistic.html and is included below. + +ARTISTIC LICENSE +================ + The "Artistic License" + + Preamble + +The intent of this document is to state the conditions under which a +Package may be copied, such that the Copyright Holder maintains some +semblance of artistic control over the development of the package, +while giving the users of the package the right to use and distribute +the Package in a more-or-less customary fashion, plus the right to make +reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the + Copyright Holder, and derivatives of that collection of files + created through textual modification. + + "Standard Version" refers to such a Package if it has not been + modified, or has been modified in accordance with the wishes + of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or + copyrights for the package. + + "You" is you, if you're thinking about copying or distributing + this Package. + + "Reasonable copying fee" is whatever you can justify on the + basis of media cost, duplication charges, time of people involved, + and so on. (You will not be required to justify it to the + Copyright Holder, but only to the computing community at large + as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item + itself, though there may be fees involved in handling the item. + It also means that recipients of the item may redistribute it + under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you +duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications +derived from the Public Domain or from the Copyright Holder. A Package +modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and +when you changed that file, and provided that you do at least ONE of the +following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or + an equivalent medium, or placing the modifications on a major archive + site such as uunet.uu.net, or by allowing the Copyright Holder to include + your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict + with standard executables, which must also be provided, and provide + a separate manual page for each non-standard executable that clearly + documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or +executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, + together with instructions (in the manual page or equivalent) on where + to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly + document the differences in manual pages (or equivalent), together + with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this +Package. You may charge any fee you choose for support of this +Package. You may not charge a fee for this Package itself. However, +you may distribute this Package in aggregate with other (possibly +commercial) programs as part of a larger (possibly commercial) software +distribution provided that you do not advertise this Package as a +product of your own. You may embed this Package's interpreter within +an executable of yours (by linking); this shall be construed as a mere +form of aggregation, provided that the complete Standard Version of the +interpreter is so embedded. + +6. The scripts and library files supplied as input to or produced as +output from the programs of this Package do not automatically fall +under the copyright of this Package, but belong to whoever generated +them, and may be sold commercially, and may be aggregated with this +Package. If such scripts or library files are aggregated with this +Package via the so-called "undump" or "unexec" methods of producing a +binary executable image, then distribution of such an image shall +neither be construed as a distribution of this Package nor shall it +fall under the restrictions of Paragraphs 3 and 4, provided that you do +not represent such an executable image as a Standard Version of this +Package. + +7. C subroutines (or comparably compiled subroutines in other +languages) supplied by you and linked into this Package in order to +emulate subroutines and variables of the language defined by this +Package shall not be considered part of this Package, but are the +equivalent of input as in Paragraph 6, provided these subroutines do +not change the language in any way that would cause it to fail the +regression tests for the language. + +8. Aggregation of this Package with a commercial distribution is always +permitted provided that the use of this Package is embedded; that is, +when no overt attempt is made to make this Package's interfaces visible +to the end user of the commercial distribution. Such use shall not be +construed as a distribution of this Package. + +9. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + The End + diff --git a/MANIFEST b/MANIFEST index 2fda1aa..3fd204d 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,12 +1,15 @@ benchmark/01_expat.t benchmark/hello.pl +benchmark/MEMORY_FOOTPRINT benchmark/person.pl benchmark/person.xml benchmark/person_profile.pl benchmark/person_single.pl +benchmark/README benchmark/XSD/01_anyType.t benchmark/XSD/02_anySimpleType.t benchmark/XSD/03_string.t +benchmark/XSD/strftime.pl bin/wsdl2perl.pl Build.PL Changes @@ -157,7 +160,9 @@ 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/Cookbook.pod lib/SOAP/WSDL/Manual/Deserializer.pod +lib/SOAP/WSDL/Manual/FAQ.pod lib/SOAP/WSDL/Manual/Glossary.pod lib/SOAP/WSDL/Manual/Parser.pod lib/SOAP/WSDL/Manual/Serializer.pod @@ -172,6 +177,7 @@ lib/SOAP/WSDL/PortType.pm lib/SOAP/WSDL/Serializer/XSD.pm lib/SOAP/WSDL/Server.pm lib/SOAP/WSDL/Server/CGI.pm +lib/SOAP/WSDL/Server/Mod_Perl2.pm lib/SOAP/WSDL/Service.pm lib/SOAP/WSDL/SOAP/Address.pm lib/SOAP/WSDL/SOAP/Body.pm @@ -264,11 +270,8 @@ MANIFEST This list of files META.yml MIGRATING README -SOAP-WSDL-2.00_32.tar -t/001_use.t t/002_parse_wsdl.t t/003_wsdl_based_serializer.t -t/004_parse_wsdl.t t/006_client.t t/007_envelope.t t/008_client_wsdl_complexType.t @@ -277,7 +280,6 @@ t/011_simpleType.t t/012_element.t t/013_complexType.t t/016_client_object.t -t/017_generator.t t/020_storable.t t/095_copying.t t/096_characters.t @@ -315,6 +317,7 @@ t/acceptance/wsdl/email_account.wsdl t/acceptance/wsdl/generator_test.wsdl t/acceptance/wsdl/generator_test_dot_names.wsdl t/acceptance/wsdl/generator_unsupported_test.wsdl +t/acceptance/wsdl/helloWorld_header.wsdl t/acceptance/wsdl/import.xsd t/acceptance/wsdl/import_loop.xsd t/acceptance/wsdl/message_gateway.wsdl @@ -322,9 +325,15 @@ t/acceptance/wsdl/nested_complextype.wsdl t/acceptance/wsdl/WSDLParser-import.wsdl t/acceptance/wsdl/WSDLParser-imported.wsdl t/acceptance/wsdl/WSDLParser.wsdl +t/acceptance/wsdl/WSDLParser/import_cascade.xsd +t/acceptance/wsdl/WSDLParser/import_no_location.wsdl +t/acceptance/wsdl/WSDLParser/import_xsd_cascade.wsdl +t/acceptance/wsdl/WSDLParser/imported.xsd +t/acceptance/wsdl/WSDLParser/xsd_import_no_location.wsdl t/acceptance/wsdl/WSDLParser_import_loop.wsdl t/contributed.wsdl t/Expat/03_wsdl.t +t/lib/Mod_Perl2Test.pm t/lib/MyComplexType.pm t/lib/MyElement.pm t/lib/MySimpleType.pm @@ -336,7 +345,6 @@ t/lib/Typelib/Base.pm t/lib/Typelib/TEnqueueMessage.pm t/lib/Typelib/TMessage.pm t/SOAP/WSDL.t -t/SOAP/WSDL/01_use.t t/SOAP/WSDL/02_port.t t/SOAP/WSDL/03_complexType-all.t t/SOAP/WSDL/03_complexType-choice.t @@ -366,11 +374,11 @@ t/SOAP/WSDL/Expat/WSDLParser.t t/SOAP/WSDL/Factory/Deserializer.t t/SOAP/WSDL/Factory/Serializer.t t/SOAP/WSDL/Factory/Transport.t -t/SOAP/WSDL/Generator/attr.pl t/SOAP/WSDL/Generator/Template.t t/SOAP/WSDL/Generator/Visitor.t t/SOAP/WSDL/Generator/Visitor/Typemap.t t/SOAP/WSDL/Generator/XSD.t +t/SOAP/WSDL/Generator/XSD_custom_resolver.t t/SOAP/WSDL/Generator/XSD_dot_names.t t/SOAP/WSDL/Generator/XSD_nested_complextype.t t/SOAP/WSDL/Generator/XSD_unsupported.t @@ -379,10 +387,11 @@ t/SOAP/WSDL/PortType.t t/SOAP/WSDL/Serializer/XSD.t t/SOAP/WSDL/Server.t t/SOAP/WSDL/Server/CGI.t +t/SOAP/WSDL/Server/Mod_Perl2.t t/SOAP/WSDL/Transport/01_Test.t -t/SOAP/WSDL/Transport/02_HTTP.t t/SOAP/WSDL/Transport/acceptance/test2.xml t/SOAP/WSDL/Transport/acceptance/test3.xml +t/SOAP/WSDL/Transport/HTTP.t t/SOAP/WSDL/Typelib/Fault11.t t/SOAP/WSDL/Types.t t/SOAP/WSDL/XSD/Attribute.t diff --git a/META.yml b/META.yml index f27aa1f..099eb0a 100644 --- a/META.yml +++ b/META.yml @@ -1,367 +1,373 @@ ---- -name: SOAP-WSDL -version: 2.00.01 -author: - - 'Martin Kutter ' -abstract: SOAP with WSDL support -license: artistic -resources: - license: http://opensource.org/licenses/artistic-license.php -requires: - Class::Std::Fast: 0.0.5 - Data::Dumper: 0 - Date::Format: 0 - Date::Parse: 0 - File::Basename: 0 - File::Path: 0 - Getopt::Long: 0 - LWP::UserAgent: 0 - List::Util: 0 - Template: 0 - Term::ReadKey: 0 - URI: 0 - XML::Parser::Expat: 0 - perl: 5.8.0 -build_requires: - Class::Std::Fast: 0.0.5 - Cwd: 0 - Date::Format: 0 - Date::Parse: 0 - File::Basename: 0 - File::Path: 0 - File::Spec: 0 - Getopt::Long: 0 - LWP::UserAgent: 0 - List::Util: 0 - Module::Build: 0 - Storable: 0 - Template: 0 - Test::More: 0 - XML::Parser::Expat: 0 -provides: - SOAP::WSDL: - file: lib/SOAP/WSDL.pm - version: 2.00.01 - SOAP::WSDL::Base: - file: lib/SOAP/WSDL/Base.pm - version: 2.00.01 - SOAP::WSDL::Binding: - file: lib/SOAP/WSDL/Binding.pm - version: 2.00.01 - SOAP::WSDL::Client: - file: lib/SOAP/WSDL/Client.pm - version: 2.00.01 - SOAP::WSDL::Client::Base: - file: lib/SOAP/WSDL/Client/Base.pm - version: 2.00.01 - SOAP::WSDL::Definitions: - file: lib/SOAP/WSDL/Definitions.pm - version: 2.00.01 - SOAP::WSDL::Deserializer::Hash: - file: lib/SOAP/WSDL/Deserializer/Hash.pm - version: 2.00.01 - SOAP::WSDL::Deserializer::SOM: - file: lib/SOAP/WSDL/Deserializer/SOM.pm - version: 2.00.01 - SOAP::WSDL::Deserializer::XSD: - file: lib/SOAP/WSDL/Deserializer/XSD.pm - version: 2.00.01 - SOAP::WSDL::Expat::Base: - file: lib/SOAP/WSDL/Expat/Base.pm - version: 2.00.01 - SOAP::WSDL::Expat::Message2Hash: - file: lib/SOAP/WSDL/Expat/Message2Hash.pm - version: 2.00.01 - SOAP::WSDL::Expat::MessageParser: - file: lib/SOAP/WSDL/Expat/MessageParser.pm - version: 2.00.01 - SOAP::WSDL::Expat::MessageStreamParser: - file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm - version: 2.00.01 - SOAP::WSDL::Factory::Deserializer: - file: lib/SOAP/WSDL/Factory/Deserializer.pm - version: 2.00.01 - SOAP::WSDL::Factory::Generator: - file: lib/SOAP/WSDL/Factory/Generator.pm - version: 2.00.01 - SOAP::WSDL::Factory::Serializer: - file: lib/SOAP/WSDL/Factory/Serializer.pm - version: 2.00.01 - SOAP::WSDL::Factory::Transport: - file: lib/SOAP/WSDL/Factory/Transport.pm - version: 2.00.01 - SOAP::WSDL::Generator::Iterator::WSDL11: - file: lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm - version: 2.00.01 - SOAP::WSDL::Generator::PrefixResolver: - file: lib/SOAP/WSDL/Generator/PrefixResolver.pm - version: 2.00.01 - SOAP::WSDL::Generator::Template: - file: lib/SOAP/WSDL/Generator/Template.pm - version: 2.00.01 - SOAP::WSDL::Generator::Template::Plugin::XSD: - file: lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm - version: 2.00.01 - SOAP::WSDL::Generator::Template::XSD: - file: lib/SOAP/WSDL/Generator/Template/XSD.pm - version: 2.00.01 - SOAP::WSDL::Generator::Visitor: - file: lib/SOAP/WSDL/Generator/Visitor.pm - version: 2.00.01 - SOAP::WSDL::Generator::Visitor::Typelib: - file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm - version: 2.00.01 - SOAP::WSDL::Generator::Visitor::Typemap: - file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm - version: 2.00.01 - SOAP::WSDL::Message: - file: lib/SOAP/WSDL/Message.pm - version: 2.00.01 - SOAP::WSDL::OpMessage: - file: lib/SOAP/WSDL/OpMessage.pm - version: 2.00.01 - SOAP::WSDL::Operation: - file: lib/SOAP/WSDL/Operation.pm - version: 2.00.01 - SOAP::WSDL::Part: - file: lib/SOAP/WSDL/Part.pm - version: 2.00.01 - SOAP::WSDL::Port: - file: lib/SOAP/WSDL/Port.pm - version: 2.00.01 - SOAP::WSDL::PortType: - file: lib/SOAP/WSDL/PortType.pm - version: 2.00.01 - SOAP::WSDL::SOAP::Address: - file: lib/SOAP/WSDL/SOAP/Address.pm - version: 2.00.01 - SOAP::WSDL::SOAP::Body: - file: lib/SOAP/WSDL/SOAP/Body.pm - version: 2.00.01 - SOAP::WSDL::SOAP::Header: - file: lib/SOAP/WSDL/SOAP/Header.pm - version: 2.00.01 - SOAP::WSDL::SOAP::HeaderFault: - file: lib/SOAP/WSDL/SOAP/HeaderFault.pm - version: 2.00.01 - SOAP::WSDL::SOAP::Operation: - file: lib/SOAP/WSDL/SOAP/Operation.pm - version: 2.00.01 - SOAP::WSDL::SOAP::Typelib::Fault11: - file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm - version: 2.00.01 - SOAP::WSDL::Serializer::XSD: - file: lib/SOAP/WSDL/Serializer/XSD.pm - version: 2.00.01 - SOAP::WSDL::Server: - file: lib/SOAP/WSDL/Server.pm - version: 2.00.01 - SOAP::WSDL::Server::CGI: - file: lib/SOAP/WSDL/Server/CGI.pm - version: 2.00.01 - SOAP::WSDL::Service: - file: lib/SOAP/WSDL/Service.pm - version: 2.00.01 - SOAP::WSDL::Transport::HTTP: - file: lib/SOAP/WSDL/Transport/HTTP.pm - version: 2.00.01 - SOAP::WSDL::Transport::Loopback: - file: lib/SOAP/WSDL/Transport/Loopback.pm - version: 2.00.01 - SOAP::WSDL::Transport::Test: - file: lib/SOAP/WSDL/Transport/Test.pm - version: 2.00.01 - SOAP::WSDL::TypeLookup: - file: lib/SOAP/WSDL/TypeLookup.pm - version: 2.00.01 - SOAP::WSDL::Types: - file: lib/SOAP/WSDL/Types.pm - version: 2.00.01 - SOAP::WSDL::XSD::Annotation: - file: lib/SOAP/WSDL/XSD/Annotation.pm - version: 2.00.01 - SOAP::WSDL::XSD::Attribute: - file: lib/SOAP/WSDL/XSD/Attribute.pm - version: 2.00.01 - SOAP::WSDL::XSD::AttributeGroup: - file: lib/SOAP/WSDL/XSD/AttributeGroup.pm - version: 2.00.01 - SOAP::WSDL::XSD::Builtin: - file: lib/SOAP/WSDL/XSD/Builtin.pm - version: 2.00.01 - SOAP::WSDL::XSD::ComplexType: - file: lib/SOAP/WSDL/XSD/ComplexType.pm - version: 2.00.01 - SOAP::WSDL::XSD::Element: - file: lib/SOAP/WSDL/XSD/Element.pm - version: 2.00.01 - SOAP::WSDL::XSD::Enumeration: - file: lib/SOAP/WSDL/XSD/Enumeration.pm - version: 2.00.01 - SOAP::WSDL::XSD::FractionDigits: - file: lib/SOAP/WSDL/XSD/FractionDigits.pm - version: 2.00.01 - SOAP::WSDL::XSD::Group: - file: lib/SOAP/WSDL/XSD/Group.pm - version: 2.00.01 - SOAP::WSDL::XSD::Length: - file: lib/SOAP/WSDL/XSD/Length.pm - version: 2.00.01 - SOAP::WSDL::XSD::MaxExclusive: - file: lib/SOAP/WSDL/XSD/MaxExclusive.pm - version: 2.00.01 - SOAP::WSDL::XSD::MaxInclusive: - file: lib/SOAP/WSDL/XSD/MaxInclusive.pm - version: 2.00.01 - SOAP::WSDL::XSD::MaxLength: - file: lib/SOAP/WSDL/XSD/MaxLength.pm - version: 2.00.01 - SOAP::WSDL::XSD::MinExclusive: - file: lib/SOAP/WSDL/XSD/MinExclusive.pm - version: 2.00.01 - SOAP::WSDL::XSD::MinInclusive: - file: lib/SOAP/WSDL/XSD/MinInclusive.pm - version: 2.00.01 - SOAP::WSDL::XSD::MinLength: - file: lib/SOAP/WSDL/XSD/MinLength.pm - version: 2.00.01 - SOAP::WSDL::XSD::Pattern: - file: lib/SOAP/WSDL/XSD/Pattern.pm - version: 2.00.01 - SOAP::WSDL::XSD::Schema: - file: lib/SOAP/WSDL/XSD/Schema.pm - version: 2.00.01 - SOAP::WSDL::XSD::Schema::Builtin: - file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm - version: 2.00.01 - SOAP::WSDL::XSD::SimpleType: - file: lib/SOAP/WSDL/XSD/SimpleType.pm - version: 2.00.01 - SOAP::WSDL::XSD::TotalDigits: - file: lib/SOAP/WSDL/XSD/TotalDigits.pm - version: 2.00.01 - SOAP::WSDL::XSD::Typelib::Attribute: - file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm - version: 2.00.01 - SOAP::WSDL::XSD::Typelib::AttributeSet: - file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm - version: 2.00.01 - SOAP::WSDL::XSD::Typelib::Builtin: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm - version: 2.00.01 - SOAP::WSDL::XSD::Typelib::Builtin::ENTITY: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm - SOAP::WSDL::XSD::Typelib::Builtin::ID: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ID.pm - SOAP::WSDL::XSD::Typelib::Builtin::IDREF: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.pm - SOAP::WSDL::XSD::Typelib::Builtin::IDREFS: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.pm - SOAP::WSDL::XSD::Typelib::Builtin::NCName: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm - SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm - SOAP::WSDL::XSD::Typelib::Builtin::NMTOKENS: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm - SOAP::WSDL::XSD::Typelib::Builtin::NOTATION: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm - SOAP::WSDL::XSD::Typelib::Builtin::Name: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm - SOAP::WSDL::XSD::Typelib::Builtin::QName: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm - SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm - SOAP::WSDL::XSD::Typelib::Builtin::anyType: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm - version: 2.00_29 - SOAP::WSDL::XSD::Typelib::Builtin::anyURI: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm - SOAP::WSDL::XSD::Typelib::Builtin::base64Binary: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm - SOAP::WSDL::XSD::Typelib::Builtin::boolean: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm - version: 2.00_23 - SOAP::WSDL::XSD::Typelib::Builtin::byte: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm - SOAP::WSDL::XSD::Typelib::Builtin::date: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm - SOAP::WSDL::XSD::Typelib::Builtin::dateTime: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm - SOAP::WSDL::XSD::Typelib::Builtin::decimal: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm - SOAP::WSDL::XSD::Typelib::Builtin::double: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm - SOAP::WSDL::XSD::Typelib::Builtin::duration: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm - SOAP::WSDL::XSD::Typelib::Builtin::float: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm - SOAP::WSDL::XSD::Typelib::Builtin::gDay: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm - SOAP::WSDL::XSD::Typelib::Builtin::gMonth: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm - SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm - SOAP::WSDL::XSD::Typelib::Builtin::gYear: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm - SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm - SOAP::WSDL::XSD::Typelib::Builtin::hexBinary: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm - SOAP::WSDL::XSD::Typelib::Builtin::int: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm - SOAP::WSDL::XSD::Typelib::Builtin::integer: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm - SOAP::WSDL::XSD::Typelib::Builtin::language: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm - SOAP::WSDL::XSD::Typelib::Builtin::list: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm - SOAP::WSDL::XSD::Typelib::Builtin::long: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm - SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm - SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm - SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm - SOAP::WSDL::XSD::Typelib::Builtin::normalizedString: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm - SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm - SOAP::WSDL::XSD::Typelib::Builtin::short: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm - SOAP::WSDL::XSD::Typelib::Builtin::string: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm - SOAP::WSDL::XSD::Typelib::Builtin::time: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm - version: 2.00_25 - SOAP::WSDL::XSD::Typelib::Builtin::token: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm - SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm - SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm - SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm - SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort: - file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm - SOAP::WSDL::XSD::Typelib::ComplexType: - file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm - version: 2.00.01 - SOAP::WSDL::XSD::Typelib::Element: - file: lib/SOAP/WSDL/XSD/Typelib/Element.pm - version: 2.00.01 - SOAP::WSDL::XSD::Typelib::SimpleType: - file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm - version: 2.00.01 - SOAP::WSDL::XSD::Typelib::SimpleType::restriction: - file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm - version: 2.00.01 - SOAP::WSDL::XSD::WhiteSpace: - file: lib/SOAP/WSDL/XSD/WhiteSpace.pm - version: 2.00.01 -generated_by: Module::Build version 0.2808 -meta-spec: - url: http://module-build.sourceforge.net/META-spec-v1.2.html - version: 1.2 -no_index: - directory: lib/SOAP/WSDL/Generator/Template/XSD/ +--- +name: SOAP-WSDL +version: 2.00.02 +author: + - 'Martin Kutter ' +abstract: SOAP with WSDL support +license: artistic +resources: + license: http://opensource.org/licenses/artistic-license.php +requires: + Class::Std::Fast: 0.0.5 + Data::Dumper: 0 + Date::Format: 0 + Date::Parse: 0 + File::Basename: 0 + File::Path: 0 + Getopt::Long: 0 + LWP::UserAgent: 0 + List::Util: 0 + Template: 2.18 + Term::ReadKey: 0 + URI: 0 + XML::Parser::Expat: 0 + perl: 5.8.0 +build_requires: + Class::Std::Fast: 0.0.5 + Cwd: 0 + Date::Format: 0 + Date::Parse: 0 + File::Basename: 0 + File::Path: 0 + File::Spec: 0 + Getopt::Long: 0 + LWP::UserAgent: 0 + List::Util: 0 + Module::Build: 0 + Storable: 0 + Template: 2.18 + Test::More: 0 + XML::Parser::Expat: 0 +provides: + SOAP::WSDL: + file: lib/SOAP/WSDL.pm + version: 2.00.02 + SOAP::WSDL::Base: + file: lib/SOAP/WSDL/Base.pm + version: 2.00.02 + SOAP::WSDL::Binding: + file: lib/SOAP/WSDL/Binding.pm + version: 2.00.02 + SOAP::WSDL::Client: + file: lib/SOAP/WSDL/Client.pm + version: 2.00.02 + SOAP::WSDL::Client::Base: + file: lib/SOAP/WSDL/Client/Base.pm + version: 2.00.02 + SOAP::WSDL::Definitions: + file: lib/SOAP/WSDL/Definitions.pm + version: 2.00.02 + SOAP::WSDL::Deserializer::Hash: + file: lib/SOAP/WSDL/Deserializer/Hash.pm + version: 2.00.02 + SOAP::WSDL::Deserializer::SOM: + file: lib/SOAP/WSDL/Deserializer/SOM.pm + version: 2.00.02 + SOAP::WSDL::Deserializer::XSD: + file: lib/SOAP/WSDL/Deserializer/XSD.pm + version: 2.00.02 + SOAP::WSDL::Expat::Base: + file: lib/SOAP/WSDL/Expat/Base.pm + version: 2.00.02 + SOAP::WSDL::Expat::Message2Hash: + file: lib/SOAP/WSDL/Expat/Message2Hash.pm + version: 2.00.02 + SOAP::WSDL::Expat::MessageParser: + file: lib/SOAP/WSDL/Expat/MessageParser.pm + version: 2.00.02 + SOAP::WSDL::Expat::MessageStreamParser: + file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm + version: 2.00.02 + SOAP::WSDL::Expat::WSDLParser: + file: lib/SOAP/WSDL/Expat/WSDLParser.pm + version: 2.00.02 + SOAP::WSDL::Factory::Deserializer: + file: lib/SOAP/WSDL/Factory/Deserializer.pm + version: 2.00.02 + SOAP::WSDL::Factory::Generator: + file: lib/SOAP/WSDL/Factory/Generator.pm + version: 2.00.02 + SOAP::WSDL::Factory::Serializer: + file: lib/SOAP/WSDL/Factory/Serializer.pm + version: 2.00.02 + SOAP::WSDL::Factory::Transport: + file: lib/SOAP/WSDL/Factory/Transport.pm + version: 2.00.02 + SOAP::WSDL::Generator::Iterator::WSDL11: + file: lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm + version: 2.00.02 + SOAP::WSDL::Generator::PrefixResolver: + file: lib/SOAP/WSDL/Generator/PrefixResolver.pm + version: 2.00.02 + SOAP::WSDL::Generator::Template: + file: lib/SOAP/WSDL/Generator/Template.pm + version: 2.00.02 + SOAP::WSDL::Generator::Template::Plugin::XSD: + file: lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm + version: 2.00.02 + SOAP::WSDL::Generator::Template::XSD: + file: lib/SOAP/WSDL/Generator/Template/XSD.pm + version: 2.00.02 + SOAP::WSDL::Generator::Visitor: + file: lib/SOAP/WSDL/Generator/Visitor.pm + version: 2.00.02 + SOAP::WSDL::Generator::Visitor::Typelib: + file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm + version: 2.00.02 + SOAP::WSDL::Generator::Visitor::Typemap: + file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm + version: 2.00.02 + SOAP::WSDL::Message: + file: lib/SOAP/WSDL/Message.pm + version: 2.00.02 + SOAP::WSDL::OpMessage: + file: lib/SOAP/WSDL/OpMessage.pm + version: 2.00.02 + SOAP::WSDL::Operation: + file: lib/SOAP/WSDL/Operation.pm + version: 2.00.02 + SOAP::WSDL::Part: + file: lib/SOAP/WSDL/Part.pm + version: 2.00.02 + SOAP::WSDL::Port: + file: lib/SOAP/WSDL/Port.pm + version: 2.00.02 + SOAP::WSDL::PortType: + file: lib/SOAP/WSDL/PortType.pm + version: 2.00.02 + SOAP::WSDL::SOAP::Address: + file: lib/SOAP/WSDL/SOAP/Address.pm + version: 2.00.02 + SOAP::WSDL::SOAP::Body: + file: lib/SOAP/WSDL/SOAP/Body.pm + version: 2.00.02 + SOAP::WSDL::SOAP::Header: + file: lib/SOAP/WSDL/SOAP/Header.pm + version: 2.00.02 + SOAP::WSDL::SOAP::HeaderFault: + file: lib/SOAP/WSDL/SOAP/HeaderFault.pm + version: 2.00.02 + SOAP::WSDL::SOAP::Operation: + file: lib/SOAP/WSDL/SOAP/Operation.pm + version: 2.00.02 + SOAP::WSDL::SOAP::Typelib::Fault11: + file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm + version: 2.00.02 + SOAP::WSDL::Serializer::XSD: + file: lib/SOAP/WSDL/Serializer/XSD.pm + version: 2.00.02 + SOAP::WSDL::Server: + file: lib/SOAP/WSDL/Server.pm + version: 2.00.02 + SOAP::WSDL::Server::CGI: + file: lib/SOAP/WSDL/Server/CGI.pm + version: 2.00.02 + SOAP::WSDL::Server::Mod_Perl2: + file: lib/SOAP/WSDL/Server/Mod_Perl2.pm + version: 2.00.02 + SOAP::WSDL::Service: + file: lib/SOAP/WSDL/Service.pm + version: 2.00.02 + SOAP::WSDL::Transport::HTTP: + file: lib/SOAP/WSDL/Transport/HTTP.pm + version: 2.00.02 + SOAP::WSDL::Transport::Loopback: + file: lib/SOAP/WSDL/Transport/Loopback.pm + version: 2.00.02 + SOAP::WSDL::Transport::Test: + file: lib/SOAP/WSDL/Transport/Test.pm + version: 2.00.02 + SOAP::WSDL::TypeLookup: + file: lib/SOAP/WSDL/TypeLookup.pm + version: 2.00.02 + SOAP::WSDL::Types: + file: lib/SOAP/WSDL/Types.pm + version: 2.00.02 + SOAP::WSDL::XSD::Annotation: + file: lib/SOAP/WSDL/XSD/Annotation.pm + version: 2.00.02 + SOAP::WSDL::XSD::Attribute: + file: lib/SOAP/WSDL/XSD/Attribute.pm + version: 2.00.02 + SOAP::WSDL::XSD::AttributeGroup: + file: lib/SOAP/WSDL/XSD/AttributeGroup.pm + version: 2.00.02 + SOAP::WSDL::XSD::Builtin: + file: lib/SOAP/WSDL/XSD/Builtin.pm + version: 2.00.02 + SOAP::WSDL::XSD::ComplexType: + file: lib/SOAP/WSDL/XSD/ComplexType.pm + version: 2.00.02 + SOAP::WSDL::XSD::Element: + file: lib/SOAP/WSDL/XSD/Element.pm + version: 2.00.02 + SOAP::WSDL::XSD::Enumeration: + file: lib/SOAP/WSDL/XSD/Enumeration.pm + version: 2.00.02 + SOAP::WSDL::XSD::FractionDigits: + file: lib/SOAP/WSDL/XSD/FractionDigits.pm + version: 2.00.02 + SOAP::WSDL::XSD::Group: + file: lib/SOAP/WSDL/XSD/Group.pm + version: 2.00.02 + SOAP::WSDL::XSD::Length: + file: lib/SOAP/WSDL/XSD/Length.pm + version: 2.00.02 + SOAP::WSDL::XSD::MaxExclusive: + file: lib/SOAP/WSDL/XSD/MaxExclusive.pm + version: 2.00.02 + SOAP::WSDL::XSD::MaxInclusive: + file: lib/SOAP/WSDL/XSD/MaxInclusive.pm + version: 2.00.02 + SOAP::WSDL::XSD::MaxLength: + file: lib/SOAP/WSDL/XSD/MaxLength.pm + version: 2.00.02 + SOAP::WSDL::XSD::MinExclusive: + file: lib/SOAP/WSDL/XSD/MinExclusive.pm + version: 2.00.02 + SOAP::WSDL::XSD::MinInclusive: + file: lib/SOAP/WSDL/XSD/MinInclusive.pm + version: 2.00.02 + SOAP::WSDL::XSD::MinLength: + file: lib/SOAP/WSDL/XSD/MinLength.pm + version: 2.00.02 + SOAP::WSDL::XSD::Pattern: + file: lib/SOAP/WSDL/XSD/Pattern.pm + version: 2.00.02 + SOAP::WSDL::XSD::Schema: + file: lib/SOAP/WSDL/XSD/Schema.pm + version: 2.00.02 + SOAP::WSDL::XSD::Schema::Builtin: + file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm + version: 2.00.02 + SOAP::WSDL::XSD::SimpleType: + file: lib/SOAP/WSDL/XSD/SimpleType.pm + version: 2.00.02 + SOAP::WSDL::XSD::TotalDigits: + file: lib/SOAP/WSDL/XSD/TotalDigits.pm + version: 2.00.02 + SOAP::WSDL::XSD::Typelib::Attribute: + file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm + version: 2.00.02 + SOAP::WSDL::XSD::Typelib::AttributeSet: + file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm + version: 2.00.02 + SOAP::WSDL::XSD::Typelib::Builtin: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm + version: 2.00.02 + SOAP::WSDL::XSD::Typelib::Builtin::ENTITY: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm + SOAP::WSDL::XSD::Typelib::Builtin::ID: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ID.pm + SOAP::WSDL::XSD::Typelib::Builtin::IDREF: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.pm + SOAP::WSDL::XSD::Typelib::Builtin::IDREFS: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.pm + SOAP::WSDL::XSD::Typelib::Builtin::NCName: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm + SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm + SOAP::WSDL::XSD::Typelib::Builtin::NMTOKENS: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm + SOAP::WSDL::XSD::Typelib::Builtin::NOTATION: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm + SOAP::WSDL::XSD::Typelib::Builtin::Name: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm + SOAP::WSDL::XSD::Typelib::Builtin::QName: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm + SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm + SOAP::WSDL::XSD::Typelib::Builtin::anyType: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm + version: 2.00.02 + SOAP::WSDL::XSD::Typelib::Builtin::anyURI: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm + SOAP::WSDL::XSD::Typelib::Builtin::base64Binary: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm + SOAP::WSDL::XSD::Typelib::Builtin::boolean: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm + version: 2.00.02 + SOAP::WSDL::XSD::Typelib::Builtin::byte: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm + SOAP::WSDL::XSD::Typelib::Builtin::date: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm + SOAP::WSDL::XSD::Typelib::Builtin::dateTime: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm + SOAP::WSDL::XSD::Typelib::Builtin::decimal: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm + SOAP::WSDL::XSD::Typelib::Builtin::double: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm + SOAP::WSDL::XSD::Typelib::Builtin::duration: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm + SOAP::WSDL::XSD::Typelib::Builtin::float: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm + SOAP::WSDL::XSD::Typelib::Builtin::gDay: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm + SOAP::WSDL::XSD::Typelib::Builtin::gMonth: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm + SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm + SOAP::WSDL::XSD::Typelib::Builtin::gYear: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm + SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm + SOAP::WSDL::XSD::Typelib::Builtin::hexBinary: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm + SOAP::WSDL::XSD::Typelib::Builtin::int: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm + SOAP::WSDL::XSD::Typelib::Builtin::integer: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm + SOAP::WSDL::XSD::Typelib::Builtin::language: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm + SOAP::WSDL::XSD::Typelib::Builtin::list: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm + SOAP::WSDL::XSD::Typelib::Builtin::long: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm + SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm + SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm + SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm + SOAP::WSDL::XSD::Typelib::Builtin::normalizedString: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm + SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm + SOAP::WSDL::XSD::Typelib::Builtin::short: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm + SOAP::WSDL::XSD::Typelib::Builtin::string: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm + SOAP::WSDL::XSD::Typelib::Builtin::time: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm + version: 2.00.02 + SOAP::WSDL::XSD::Typelib::Builtin::token: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm + SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm + SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm + SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm + SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort: + file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm + SOAP::WSDL::XSD::Typelib::ComplexType: + file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm + version: 2.1.0 + SOAP::WSDL::XSD::Typelib::Element: + file: lib/SOAP/WSDL/XSD/Typelib/Element.pm + version: 2.00.02 + SOAP::WSDL::XSD::Typelib::SimpleType: + file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm + version: 2.00.02 + SOAP::WSDL::XSD::Typelib::SimpleType::restriction: + file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm + version: 2.00.02 + SOAP::WSDL::XSD::WhiteSpace: + file: lib/SOAP/WSDL/XSD/WhiteSpace.pm + version: 2.00.02 +generated_by: Module::Build version 0.2808 +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.2.html + version: 1.2 +no_index: + directory: lib/SOAP/WSDL/Generator/Template/XSD/ diff --git a/Makefile.PL b/Makefile.PL index 2d25812..1b91752 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -1,6 +1,6 @@ -# Note: this file was auto-generated by Module::Build::Compat version 0.03 - use Module::Build::Compat 0.02; - - Module::Build::Compat->run_build_pl(args => \@ARGV); - require Module::Build; - Module::Build::Compat->write_makefile(build_class => 'Module::Build'); +# Note: this file was auto-generated by Module::Build::Compat version 0.03 + use Module::Build::Compat 0.02; + + Module::Build::Compat->run_build_pl(args => \@ARGV); + require Module::Build; + Module::Build::Compat->write_makefile(build_class => 'Module::Build'); diff --git a/SOAP-WSDL-2.00_32.tar b/SOAP-WSDL-2.00_32.tar deleted file mode 100644 index 943f12b..0000000 Binary files a/SOAP-WSDL-2.00_32.tar and /dev/null differ diff --git a/TEST_COVERAGE b/TEST_COVERAGE index a909342..88897ab 100644 --- a/TEST_COVERAGE +++ b/TEST_COVERAGE @@ -8,7 +8,7 @@ # cd t/ cover -delete -find . -type f -name '*.t' | xargs -n 1 /usr/bin/perl -MDevel::Cover=-silent,1,-summary,0 -I../lib +find . -type f -name '*.t' | xargs -n 1 /usr/bin/perl -MDevel::Cover=-silent,1,-summary,0 -I../lib > /dev/null # Devel::CoverX::Covered covered runs diff --git a/benchmark/MEMORY_FOOTPRINT b/benchmark/MEMORY_FOOTPRINT new file mode 100644 index 0000000..089d960 --- /dev/null +++ b/benchmark/MEMORY_FOOTPRINT @@ -0,0 +1,59 @@ +Memory footprints for example/ scripts comparing SOAP::WSDL, SOAP::Lite and +XML::Compile::SOAP + +Results with perl-5.8.8 on Ubuntu 8.04 (x86): + + PID %CPU %MEM VSZ RSS COMMAND +10183 12.0 1.1 14292 11492 perl -I../lib hello.pl +10554 7.2 0.9 12636 9828 perl hello_lite.pl +10224 17.5 1.6 20780 17012 perl hello_compile.pl +10287 25.0 1.1 14680 11776 perl -I../lib person.pl +10313 24.0 1.6 21068 17312 perl person_compile.pl + +Summary of my perl5 (revision 5 version 8 subversion 8) configuration: + Platform: + osname=linux, osvers=2.6.15.7, archname=i486-linux-gnu-thread-multi + uname='linux palmer 2.6.15.7 #1 smp thu sep 7 19:42:20 utc 2006 i686 gnulinux ' + config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.8.8 -Dsitearch=/usr/local/lib/perl/5.8.8 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -Duseshrplib -Dlibperl=libperl.so.5.8.8 -Dd_dosuid -des' + hint=recommended, useposix=true, d_sigaction=define + usethreads=define use5005threads=undef useithreads=define usemultiplicity=define + useperlio=define d_sfio=undef uselargefiles=define usesocks=undef + use64bitint=undef use64bitall=undef uselongdouble=undef + usemymalloc=n, bincompat5005=undef + Compiler: + cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', + optimize='-O2', + cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include' + ccversion='', gccversion='4.2.3 20071123 (prerelease) (Ubuntu 4.2.2-3ubuntu4)', gccosandvers='' + intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 + d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 + ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 + alignbytes=4, prototype=define + Linker and Libraries: + ld='cc', ldflags =' -L/usr/local/lib' + libpth=/usr/local/lib /lib /usr/lib + libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt + perllibs=-ldl -lm -lpthread -lc -lcrypt + libc=/lib/libc-2.6.1.so, so=so, useshrplib=true, libperl=libperl.so.5.8.8 + gnulibc_version='2.6.1' + Dynamic Linking: + dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E' + cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib' + + +Characteristics of this binary (from libperl): + Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT + PERL_MALLOC_WRAP THREADS_HAVE_PIDS USE_ITHREADS + USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API + Built under linux + Compiled at Nov 27 2007 10:44:36 + @INC: + /etc/perl + /usr/local/lib/perl/5.8.8 + /usr/local/share/perl/5.8.8 + /usr/lib/perl5 + /usr/share/perl5 + /usr/lib/perl/5.8 + /usr/share/perl/5.8 + /usr/local/lib/site_perl + . diff --git a/benchmark/README b/benchmark/README new file mode 100644 index 0000000..b24fb98 --- /dev/null +++ b/benchmark/README @@ -0,0 +1,77 @@ +The benchmark directory includes a bunch of benchmarks. The most notable +ones are listed below. + +Comparison benchmarks for SOAP::Lite, SOAP::WSDL, SOAP::WSDL_XS, and +XML::Compile::WSDP need all of these installed for the benchmark to +work (building and adding to the lib path suffices). All comparison benchmarks +only account for the client part of the respective modules - the server part +is not benchmarked. + +SOAP::WSDL_XS can be obtained from the project's subversion repository at + +https://soap-wsdl.svn.sourceforge.net/svnroot/SOAP-WSDL/SOAP-WSDL_XS/trunk + +Some benchmarks expect to find the SOAP servers "cgi-bin/person.pl" and +"cgi-bin/hello.pl" from the examples directory at +http://localhost:81/soap-wsdl-test/person.pl and +http://localhost:81/soap-wsdl-test/hello.pl + +If the web services are not set up properly, you're benchmarking error +creation times. + +To set up a SOAP server using apache, add the following to your apache config: + + # usually in main config + Listen 127.0.0.1:81 + + # maybe in a + # container + # + ScriptAlias /soap-wsdl-test/ /PATH_TO/SOAP-WSDL/example/cgi-bin/ + + AllowOverride None + Order allow,deny + Allow from all + + +Using mod_perl is highly recommended to cut down benchmarking time. + +COMPARISON BENCHMARKS +===================== + +01_expat.t +---------- +Benchmarks XML parsing speed between XML::Simple with XML::Parser as backend, +SOAP::Lite, SOAP::WSDL outputting objects, SOAP::WSDL outputting hash refs, +XML::LibXML with a simple DOM walker outputting hash refs, XML::LibXML +outputting the DOM and SOAP::WSDL_XS. + +No web server required. + +This benchmark sheds light on how much performance is - in theory - reachable +by each approach: The XML::LibXML (Hash) benchmark converts the DOM into +a nested hash using a recursive function. This is - basically - how +XML::Compile works. XML::Simple uses XML::Parser's streaming +API. SOAP::WSDL uses XML::Parser::Expat, XML::Parser's low-level backend, +to create objects or - in the (Hash) variant - nested hashes similar to +those created by XML::Simple. +SOAP::WSDL_XS uses a libexpat-based XS parser to create perl objects, and +XML::LibXML (DOM) creates a C level libxml2 DOM accessible from perl. + +person.pl: +---------- +Sends a empty requests and receives a response of ca. 10kB. +Modeled after a common enterprise setup: "Give me a list of person data sets". + +For this benchmark, XML parsing speed is important. XML generation speed is +only weighted in the last two runs, and weights around 1/10 of parsing speed. + +hello.pl: +--------- +Sends a request containing name and given name and politely replies +"Hello ". +An example for very short requests and responses. + +For this example, handling and generating small requests/responses, and +transport speed is important. As the XML transmitted is relatively small, the +transport layer's overhead is important. diff --git a/benchmark/XSD/strftime.pl b/benchmark/XSD/strftime.pl new file mode 100644 index 0000000..ab9b621 --- /dev/null +++ b/benchmark/XSD/strftime.pl @@ -0,0 +1,24 @@ +use Benchmark qw(cmpthese); +use POSIX (); +use Date::Format (); + +my @time_from = localtime; + +print "Comparing POSIX::strftime and Date::Format::strftime '%Y-%m-%dT%H:%M:%S%z'\n\n"; +print 'POSIX: ', POSIX::strftime('%Y-%m-%dT%H:%M:%S%z', @time_from), "\n"; +print 'Date::Format: ', Date::Format::strftime('%Y-%m-%dT%H:%M:%S%z', @time_from), "\n"; + + +cmpthese 100000, { + POSIX => sub { POSIX::strftime('%Y-%m-%dT%H:%M:%S%z', @time_from) }, + 'Date::Format' => sub { Date::Format::strftime('%Y-%m-%dT%H:%M:%S%z', @time_from) }, +}; + +__END__ + +results with perl-5.8.8 on Ubuntu 8.04 on a Thinkpad T42 (1.7GHz Dothan): + + Rate Date::Format POSIX +Date::Format 10684/s -- -93% +POSIX 153846/s 1340% -- + diff --git a/bin/wsdl2perl.pl b/bin/wsdl2perl.pl index 5911659..44f5dac 100644 --- a/bin/wsdl2perl.pl +++ b/bin/wsdl2perl.pl @@ -11,10 +11,12 @@ use Term::ReadKey; my %opt = ( url => '', prefix => undef, + attribute_prefix => 'MyAttributes', type_prefix => 'MyTypes', element_prefix => 'MyElements', typemap_prefix => 'MyTypemaps', interface_prefix => 'MyInterfaces', + server_prefix => 'MyServer', base_path => 'lib/', proxy => undef, generator => 'XSD', @@ -51,10 +53,12 @@ my %opt = ( GetOptions(\%opt, qw( prefix|p=s + attribute_prefix|a=s type_prefix|t=s element_prefix|e=s typemap_prefix|m=s interface_prefix|i=s + server_prefix|sp=s base_path|b=s typemap_include|mi=s help|h @@ -63,7 +67,7 @@ GetOptions(\%opt, user=s password=s generator=s - server + server|s namespaces|n ) ); @@ -107,12 +111,22 @@ if (%typemap) { } }; -$generator->set_type_prefix( $opt{ type_prefix }) if $generator->can('set_type_prefix'); -$generator->set_typemap_prefix( $opt{ typemap_prefix }) if $generator->can('set_typemap_prefix'); -$generator->set_element_prefix($opt{ element_prefix }) if $generator->can('set_element_prefix'); -$generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix'); -$generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH'); -$generator->set_definitions($definitions) if $generator->can('set_definitions'); +$generator->set_attribute_prefix( $opt{ attribute_prefix }) + if $generator->can('set_attribute_prefix'); +$generator->set_type_prefix( $opt{ type_prefix }) + if $generator->can('set_type_prefix'); +$generator->set_typemap_prefix( $opt{ typemap_prefix }) + if $generator->can('set_typemap_prefix'); +$generator->set_element_prefix($opt{ element_prefix }) + if $generator->can('set_element_prefix'); +$generator->set_interface_prefix($opt{ interface_prefix }) + if $generator->can('set_interface_prefix'); +$generator->set_server_prefix($opt{ server_prefix }) + if $generator->can('set_server_prefix'); +$generator->set_OUTPUT_PATH($opt{ base_path }) + if $generator->can('set_OUTPUT_PATH'); +$generator->set_definitions($definitions) + if $generator->can('set_definitions'); # $generator->set_wsdl($xml) if $generator->can('set_wsdl'); # start with typelib, as errors will most likely occur here... @@ -137,6 +151,8 @@ wsdl2perl.pl - create perl bindings for SOAP webservices. NAME SHORT DESCRITPION ---------------------------------------------------------------------------- prefix p Prefix for both type and element classes. + attribute_prefix a Prefix for XML attribute classes. + Default: MyAttributes type_prefix t Prefix for type classes. Default: MyTypes element_prefix e Prefix for element classes. @@ -145,6 +161,8 @@ wsdl2perl.pl - create perl bindings for SOAP webservices. Default: MyTypemaps interface_prefix i Prefix for interface classes. Default: MyInterfaces + server_prefix sp Prefix for server classes. + Default: MyServer base_path b Path to create classes in. Default: . typemap_include mi File to include in typemap. Must eval() to a valid diff --git a/example/cgi-bin/helloworld.pl b/example/cgi-bin/helloworld.pl old mode 100755 new mode 100644 diff --git a/example/cgi-bin/person.pl b/example/cgi-bin/person.pl old mode 100755 new mode 100644 diff --git a/lib/SOAP/WSDL.pm b/lib/SOAP/WSDL.pm index 767935d..9bcbe99 100644 --- a/lib/SOAP/WSDL.pm +++ b/lib/SOAP/WSDL.pm @@ -14,7 +14,7 @@ use Class::Std::Fast; use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType; use LWP::UserAgent; -use version; our $VERSION= qv('2.00.01'); +use version; our $VERSION= qv('2.00.02'); my %no_dispatch_of :ATTR(:name); my %wsdl_of :ATTR(:name); @@ -240,6 +240,10 @@ sub _wsdl_init_methods :PRIVATE { return $method_info_of{ $ident }; } +# on_action is a no-op and just here for compatibility reasons. +# It returns the first parameter to allow method chaining. +sub on_action { return shift }; + sub call { my ($self, $method, @data_from) = @_; my $ident = ${ $self }; @@ -555,6 +559,12 @@ SOAP message to your favorite XML editor and run the source format command. Outputting readable XML requires lots of programming for little use: The resulting XMl is still quite unreadable. +=head2 on_action + +Setting on_action is not required any more, the appropriate value is +automatically taken from the WSDL. on_action is a no-op, and is just here +for compatibility issues. + =head1 Differences to SOAP::Lite =head2 readable @@ -796,9 +806,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: WSDL.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $ + $Id: WSDL.pm 672 2008-05-16 09:37:59Z kutterma $ + $HeadURL: https://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 53be628..2d6e102 100644 --- a/lib/SOAP/WSDL/Base.pm +++ b/lib/SOAP/WSDL/Base.pm @@ -5,7 +5,7 @@ use Class::Std::Fast::Storable; use List::Util qw(first); use Carp qw(croak carp confess); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %id_of :ATTR(:name :default<()>); my %lang_of :ATTR(:name :default<()>); @@ -24,7 +24,7 @@ sub namespaces { sub START { my ($self, $ident, $arg_ref) = @_; - $xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' }; + #$xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' }; $xmlns_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace'; $namespaces_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' }; $namespaces_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace'; @@ -34,7 +34,7 @@ sub START { sub DEMOLISH { my $self = shift; # delete upward references - delete $parent_of{ ident $self }; + delete $parent_of{ ${ $self } }; return; } @@ -129,20 +129,23 @@ sub expand { my ($self, $qname) = @_; my $ns_of = $self->namespaces(); if (not $qname=~m{:}xm) { + if (defined $ns_of->{ '#default' }) { + return $self->get_targetNamespace(), $qname; + # return $ns_of->{ '#default' }, $qname; + } + if (my $parent = $self->get_parent()) { + return $parent->expand($qname); + } die "un-prefixed element name <$qname> found, but no default namespace set\n" - if not defined $ns_of->{ '#default' }; - return $ns_of->{ '#default' }, $qname; } my ($prefix, $localname) = split /:/x, $qname; - return ($ns_of->{ $prefix }, $localname) if ($ns_of->{ $prefix }); - if (my $parent = $self->get_parent()) { return $parent->expand($qname); } - confess "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are" + croak "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are " . join(', ', keys %{ $ns_of }); } sub _expand; diff --git a/lib/SOAP/WSDL/Binding.pm b/lib/SOAP/WSDL/Binding.pm index 26e510f..f5af5a4 100644 --- a/lib/SOAP/WSDL/Binding.pm +++ b/lib/SOAP/WSDL/Binding.pm @@ -5,7 +5,7 @@ use Class::Std::Fast::Storable; use List::Util qw(first); use base qw(SOAP::WSDL::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %operation_of :ATTR(:name :default<()>); my %type_of :ATTR(:name :default<()>); diff --git a/lib/SOAP/WSDL/Client.pm b/lib/SOAP/WSDL/Client.pm index dd0bf51..c63b672 100644 --- a/lib/SOAP/WSDL/Client.pm +++ b/lib/SOAP/WSDL/Client.pm @@ -11,10 +11,11 @@ use SOAP::WSDL::Factory::Serializer; use SOAP::WSDL::Factory::Transport; use SOAP::WSDL::Expat::MessageParser; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %class_resolver_of :ATTR(:name :default<()>); my %no_dispatch_of :ATTR(:name :default<()>); +my %prefix_of :ATTR(:name :default<()>); my %outputxml_of :ATTR(:name :default<()>); my %transport_of :ATTR(:name :default<()>); my %endpoint_of :ATTR(:name :default<()>); @@ -61,7 +62,7 @@ sub set_proxy { } sub set_soap_version { - my $ident = ident shift; + my $ident = ${ $_[0] }; # remember old value to return it later - Class::Std does so, too my $soap_version = $soap_version_of{ $ident }; @@ -71,14 +72,14 @@ sub set_soap_version { delete $serializer_of{ $ident }; delete $deserializer_of{ $ident }; - $soap_version_of{ $ident } = shift; + $soap_version_of{ $ident } = $_[1]; return $soap_version; } # Mimic SOAP::Lite's behaviour for getter/setter routines SUBFACTORY: { - for (qw(class_resolver no_dispatch outputxml proxy)) { + for (qw(class_resolver no_dispatch outputxml proxy prefix)) { my $setter = "set_$_"; my $getter = "get_$_"; no strict qw(refs); ## no critic ProhibitNoStrict @@ -94,7 +95,7 @@ SUBFACTORY: { sub call { my ($self, $method, @data_from) = @_; - my $ident = ident $self; + my $ident = ${ $self }; # the only valid idiom for calling a method with both a header and a body # is @@ -124,6 +125,7 @@ sub call { method => $operation, body => $data, header => $header, + options => {prefix => $prefix_of{ $ident }}, }); return $envelope if $self->no_dispatch(); @@ -268,6 +270,39 @@ Default: text/xml; charset: utf8 +=head3 set_prefix + + $soap->set_prefix('ns2'); + +If set, alters the serialization of the request XML such that the supplied value is used as a namespace prefix for SOAP method calls. By way of example, the default XML serialization returns something like this: + + + + + + 12345 + + + + +If the sample set_prefix() call above is used prior to calling your SOAP method, the XML serialization returns this instead: + + + + + + 12345 + + + + +This is useful in cases where, for instance, one is communicating with a JAX L webservice, which tends to understand the latter but not the former. Note that this implementation is currently limited to a single additional namespace; if you require multiple custom namespaces, you should probably look into creating your own serializer. + =head2 Features different from SOAP::Lite SOAP::WSDL does not aim to be a complete replacement for SOAP::Lite - the @@ -321,7 +356,7 @@ to true. SOAP::WSDL::Client returns the complete XML response. =head3 Auto-Dispatching -SOAP::WSDL::Client does B support auto-dispatching. +SOAP::WSDL::Client B support auto-dispatching. This is on purpose: You may easily create interface classes by using SOAP::WSDL::Client and implementing something like @@ -360,10 +395,10 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: Client.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $ + $Id: Client.pm 672 2008-05-16 09:37:59Z kutterma $ + $HeadURL: https://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 440afa4..4edf45c 100644 --- a/lib/SOAP/WSDL/Client/Base.pm +++ b/lib/SOAP/WSDL/Client/Base.pm @@ -4,7 +4,7 @@ use warnings; use base 'SOAP::WSDL::Client'; use Scalar::Util qw(blessed); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); sub call { my ($self, $method, $body, $header) = @_; @@ -78,9 +78,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: Base.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $ + $Id: Base.pm 672 2008-05-16 09:37:59Z kutterma $ + $HeadURL: https://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 259bcf4..2ca5acb 100644 --- a/lib/SOAP/WSDL/Definitions.pm +++ b/lib/SOAP/WSDL/Definitions.pm @@ -9,7 +9,7 @@ use List::Util qw(first); use Class::Std::Fast::Storable; use base qw(SOAP::WSDL::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %types_of :ATTR(:name :default<[]>); my %message_of :ATTR(:name :default<[]>); @@ -118,10 +118,10 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: Definitions.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $ + $Id: Definitions.pm 672 2008-05-16 09:37:59Z kutterma $ + $HeadURL: https://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 9ffa831..0832ea9 100644 --- a/lib/SOAP/WSDL/Deserializer/Hash.pm +++ b/lib/SOAP/WSDL/Deserializer/Hash.pm @@ -8,7 +8,7 @@ use SOAP::WSDL::Expat::Message2Hash; use SOAP::WSDL::Factory::Deserializer; SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ ); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); sub BUILD { my ($self, $ident, $args_of_ref) = @_; @@ -152,9 +152,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: Hash.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $ + $Id: Hash.pm 672 2008-05-16 09:37:59Z kutterma $ + $HeadURL: https://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 d9b001f..ef8d46a 100644 --- a/lib/SOAP/WSDL/Deserializer/SOM.pm +++ b/lib/SOAP/WSDL/Deserializer/SOM.pm @@ -2,7 +2,7 @@ package SOAP::WSDL::Deserializer::SOM; use strict; use warnings; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); our @ISA; eval { @@ -114,9 +114,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: SOM.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $ + $Id: SOM.pm 672 2008-05-16 09:37:59Z kutterma $ + $HeadURL: https://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 4f07b6a..6590a37 100644 --- a/lib/SOAP/WSDL/Deserializer/XSD.pm +++ b/lib/SOAP/WSDL/Deserializer/XSD.pm @@ -5,7 +5,7 @@ use Class::Std::Fast::Storable; use SOAP::WSDL::SOAP::Typelib::Fault11; use SOAP::WSDL::Expat::MessageParser; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %class_resolver_of :ATTR(:name :default<()>); @@ -25,7 +25,7 @@ sub deserialize { $parser_of{ ${ $self } } = SOAP::WSDL::Expat::MessageParser->new() if not $parser_of{ ${ $self } }; - $parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } ); + $parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ${ $self } } ); eval { $parser_of{ ${ $self } }->parse_string( $content ) }; if ($@) { return $self->generate_fault({ @@ -99,9 +99,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: XSD.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $ + $Id: XSD.pm 672 2008-05-16 09:37:59Z kutterma $ + $HeadURL: https://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 c25481e..7265600 100644 --- a/lib/SOAP/WSDL/Expat/Base.pm +++ b/lib/SOAP/WSDL/Expat/Base.pm @@ -6,7 +6,7 @@ use XML::Parser::Expat; # TODO: convert to Class::Std::Fast based class - hash based classes suck. -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); sub new { my ($class, $arg_ref) = @_; @@ -51,7 +51,7 @@ sub parse_uri { my $uri = shift; if ($self->is_parsed($uri)){ - warn "$uri already imported. Ignoring it\n"; + warn "$uri already imported; ignoring it.\n"; return; } $self->set_parsed($uri); diff --git a/lib/SOAP/WSDL/Expat/Message2Hash.pm b/lib/SOAP/WSDL/Expat/Message2Hash.pm index 6d59357..a88f49d 100644 --- a/lib/SOAP/WSDL/Expat/Message2Hash.pm +++ b/lib/SOAP/WSDL/Expat/Message2Hash.pm @@ -4,7 +4,7 @@ use strict; use warnings; use base qw(SOAP::WSDL::Expat::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); sub _initialize { my ($self, $parser) = @_; diff --git a/lib/SOAP/WSDL/Expat/MessageParser.pm b/lib/SOAP/WSDL/Expat/MessageParser.pm index 52a7dbb..e4c1731 100644 --- a/lib/SOAP/WSDL/Expat/MessageParser.pm +++ b/lib/SOAP/WSDL/Expat/MessageParser.pm @@ -4,7 +4,7 @@ use strict; use warnings; use Carp qw(croak confess); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); use SOAP::WSDL::XSD::Typelib::Builtin; use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType; @@ -238,8 +238,14 @@ sub _initialize { # set appropriate attribute in last element # multiple values must be implemented in base class + # TODO check if hash access is faster # $_method = "add_$_localname"; $_method = "add_$_[1]"; + # + # fixup XML names for perl names + # + $_method =~s{\.}{__}xg; + $_method =~s{\-}{_}xg; $list->[-1]->$_method( $current ); $current = pop @$list; # step up in object hierarchy @@ -313,11 +319,11 @@ the same terms as perl itself =head1 Repository information - $Id: $ + $Id: MessageParser.pm 672 2008-05-16 09:37:59Z kutterma $ - $LastChangedDate: 2008-04-22 23:51:49 +0200 (Di, 22 Apr 2008) $ - $LastChangedRevision: 616 $ + $LastChangedDate: 2008-05-16 11:37:59 +0200 (Fr, 16 Mai 2008) $ + $LastChangedRevision: 672 $ $LastChangedBy: kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $ + $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $ diff --git a/lib/SOAP/WSDL/Expat/MessageStreamParser.pm b/lib/SOAP/WSDL/Expat/MessageStreamParser.pm index 914bf86..2c209af 100644 --- a/lib/SOAP/WSDL/Expat/MessageStreamParser.pm +++ b/lib/SOAP/WSDL/Expat/MessageStreamParser.pm @@ -6,7 +6,7 @@ use XML::Parser::Expat; use SOAP::WSDL::Expat::MessageParser; use base qw(SOAP::WSDL::Expat::MessageParser); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); sub parse_start { my $self = shift; @@ -69,9 +69,9 @@ the same terms as perl itself =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: MessageStreamParser.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $ + $Id: MessageStreamParser.pm 672 2008-05-16 09:37:59Z kutterma $ + $HeadURL: https://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 f930e0c..18a7e18 100644 --- a/lib/SOAP/WSDL/Expat/WSDLParser.pm +++ b/lib/SOAP/WSDL/Expat/WSDLParser.pm @@ -1,38 +1,44 @@ -package SOAP::WSDL::Expat::WSDLParser; +package SOAP::WSDL::Expat::WSDLParser; use strict; use warnings; use Carp; use SOAP::WSDL::TypeLookup; use base qw(SOAP::WSDL::Expat::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); sub _import_children { my ($self, $name, $imported, $importer, $import_namespace) = @_; - return if not $imported; my $targetNamespace = $importer->get_targetNamespace(); my $push_method = "push_$name"; my $get_method = "get_$name"; + my $default_namespace = $imported->get_xmlns()->{ '#default' }; + no strict qw(refs); my $value_ref = $imported->$get_method(); if ($value_ref) { - #print $self->get_uri(), "\n"; - #use Data::Dumper; - #print Data::Dumper::Dumper $value_ref; + $value_ref = [ $value_ref ] if (not ref $value_ref eq 'ARRAY'); - # set xmlns - can be different from parent + for (@{ $value_ref }) { + # fixup namespace - new parent may be from different namespace + if (defined ($default_namespace)) { + my $xmlns = $_->get_xmlns(); + # it's a hash ref, so we can just update values + if (! defined $xmlns->{ '#default'}) { + $xmlns->{ '#default' } = $default_namespace; + } + } # fixup targetNamespace, but don't override $_->set_targetNamespace( $import_namespace ) if ( ($import_namespace ne $targetNamespace) && ! $_->get_targetNamespace); # update parent... $_->set_parent( $importer ); + + # push elements into importing WSDL $importer->$push_method($_); } - # push elements into importing WSDL - #$importer->$push_method(@{ $value_ref }) - # if @{ $value_ref }; } } @@ -45,6 +51,10 @@ sub _import_namespace_definitions { # import namespace definitions, too my $importer_ns_of = $importer->get_xmlns(); my %xmlns_of = %{ $imported->get_xmlns() }; + + # it's a hash ref, we can just add to. + # TODO: check whether prefix is already taken. + # TODO: check wheter URI is the better key. while (my ($prefix, $url) = each %xmlns_of) { $importer_ns_of->{ $prefix } = $url; } @@ -56,6 +66,16 @@ sub xml_schema_import { my $parser = $self->clone(); my %attr_of = @_; my $import_namespace = $attr_of{ namespace }; + + if (not $attr_of{schemaLocation}) { + warn "cannot import document for namespace >$import_namespace< without location"; + return; + } + + if (not $self->get_uri) { + die "cannot import document from namespace >$import_namespace< without base uri. Use >parse_uri< or >set_uri< to set one." + } + my $uri = URI->new_abs($attr_of{schemaLocation}, $self->get_uri() ); my $imported = $parser->parse_uri($uri); @@ -78,6 +98,16 @@ sub wsdl_import { my $parser = $self->clone(); my %attr_of = @_; my $import_namespace = $attr_of{ namespace }; + + if (not $attr_of{location}) { + warn "cannot import document for namespace >$import_namespace< without location"; + return; + } + + if (not $self->get_uri) { + die "cannot import document from namespace >$import_namespace< without base uri. Use >parse_uri< or >set_uri< to set one." + } + my $uri = URI->new_abs($attr_of{location}, $self->get_uri() ); my $imported = $parser->parse_uri($uri); @@ -125,7 +155,7 @@ sub _initialize { croak $@ if ($@); my $obj = $action->{ class }->new({ parent => $current, - xmlns => { '#default' => $parser->namespace($localname) } + # xmlns => { '#default' => $parser->namespace($localname) } }) ->init( _fixup_attrs( $parser, %attrs ) ); @@ -221,7 +251,8 @@ sub _initialize { sub _fixup_attrs { my ($parser, %attrs_of) = @_; - my @attrs_from = map { $_ = + my @attrs_from = map { + $_ = { Name => $_, Value => $attrs_of{ $_ }, @@ -232,10 +263,10 @@ sub _fixup_attrs { # 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') - ? () - : +# # Other nodes should be ignored somewhere else +# ($_ eq '#default') +# ? () +# : { Name => "xmlns:$_", Value => $parser->expand_ns_prefix( $_ ), @@ -279,11 +310,11 @@ the same terms as perl itself =head1 Repository information - $Id: WSDLParser.pm 616 2008-04-22 21:51:49Z kutterma $ + $Id: WSDLParser.pm 672 2008-05-16 09:37:59Z kutterma $ - $LastChangedDate: 2008-04-22 23:51:49 +0200 (Di, 22 Apr 2008) $ - $LastChangedRevision: 616 $ + $LastChangedDate: 2008-05-16 11:37:59 +0200 (Fr, 16 Mai 2008) $ + $LastChangedRevision: 672 $ $LastChangedBy: kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $ + $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $ diff --git a/lib/SOAP/WSDL/Factory/Deserializer.pm b/lib/SOAP/WSDL/Factory/Deserializer.pm index 9e859ba..8605aaf 100644 --- a/lib/SOAP/WSDL/Factory/Deserializer.pm +++ b/lib/SOAP/WSDL/Factory/Deserializer.pm @@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Deserializer; use strict; use warnings; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %DESERIALIZER = ( '1.1' => 'SOAP::WSDL::Deserializer::XSD', diff --git a/lib/SOAP/WSDL/Factory/Generator.pm b/lib/SOAP/WSDL/Factory/Generator.pm index 2dc79c4..b195e93 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; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %GENERATOR = ( 'XSD' => 'SOAP::WSDL::Generator::Template::XSD', diff --git a/lib/SOAP/WSDL/Factory/Serializer.pm b/lib/SOAP/WSDL/Factory/Serializer.pm index 5414537..5d0d5ad 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; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %SERIALIZER = ( '1.1' => 'SOAP::WSDL::Serializer::XSD', @@ -138,9 +138,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: Serializer.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ + $Id: Serializer.pm 672 2008-05-16 09:37:59Z 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/Transport.pm b/lib/SOAP/WSDL/Factory/Transport.pm index 3327a93..0e4caa1 100644 --- a/lib/SOAP/WSDL/Factory/Transport.pm +++ b/lib/SOAP/WSDL/Factory/Transport.pm @@ -1,7 +1,7 @@ package SOAP::WSDL::Factory::Transport; use strict; use warnings; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %registered_transport_of = (); @@ -243,9 +243,9 @@ Martin Kutter Emartin.kutter fen-net.deE =head1 REPOSITORY INFORMATION - $Rev: 616 $ + $Rev: 672 $ $LastChangedBy: kutterma $ - $Id: Transport.pm 616 2008-04-22 21:51:49Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $ + $Id: Transport.pm 672 2008-05-16 09:37:59Z kutterma $ + $HeadURL: https://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/Iterator/WSDL11.pm b/lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm index e4298c4..439b570 100644 --- a/lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm +++ b/lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm @@ -2,7 +2,7 @@ package SOAP::WSDL::Generator::Iterator::WSDL11; use strict; use warnings; use Class::Std::Fast; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %definitions_of :ATTR(:name :default<[]>); my %nodes_of :ATTR(:name :default<[]>); diff --git a/lib/SOAP/WSDL/Generator/PrefixResolver.pm b/lib/SOAP/WSDL/Generator/PrefixResolver.pm index d954899..741e039 100644 --- a/lib/SOAP/WSDL/Generator/PrefixResolver.pm +++ b/lib/SOAP/WSDL/Generator/PrefixResolver.pm @@ -3,7 +3,7 @@ use strict; use warnings; use Class::Std::Fast::Storable; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %namespace_prefix_map_of :ATTR(:name :default<{}>); my %namespace_map_of :ATTR(:name :default<{}>); diff --git a/lib/SOAP/WSDL/Generator/Template.pm b/lib/SOAP/WSDL/Generator/Template.pm index b257146..b2a7fa3 100644 --- a/lib/SOAP/WSDL/Generator/Template.pm +++ b/lib/SOAP/WSDL/Generator/Template.pm @@ -5,7 +5,7 @@ use Class::Std::Fast::Storable; use Carp; use SOAP::WSDL::Generator::PrefixResolver; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %tt_of :ATTR(:get); my %definitions_of :ATTR(:name :default<()>); diff --git a/lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm b/lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm index c893155..0f70cf2 100644 --- a/lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm +++ b/lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm @@ -4,19 +4,22 @@ use warnings; use Carp qw(confess); use Class::Std::Fast::Storable constructor => 'none'; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %namespace_prefix_map_of :ATTR(:name :default<{}>); my %namespace_map_of :ATTR(:name :default<{}>); my %prefix_of :ATTR(:name :default<()>); my %prefix_resolver_of :ATTR(:name :default<()>); +my %definitions_of :ATTR(:name :default<()>); + # create a singleton -sub load { # called as MyPlugin->load($context) +sub load { # called as MyPlugin->load($context) my ($class, $context, @arg_from) = @_; my $stash = $context->stash(); my $self = bless \do { my $o = Class::Std::Fast::ID() }, $class; $self->set_prefix_resolver( $stash->{ context }->{ prefix_resolver }); + $self->set_definitions( $stash->{ definitions }); return $self; # returns 'MyPlugin' } @@ -27,6 +30,7 @@ sub new { my $self = bless \do { my $o = Class::Std::Fast::ID() }, $class; $self->set_prefix_resolver( $arg_ref->{ prefix_resolver }); + $self->set_definitions( $arg_ref->{ definitions }); return $self; # returns 'MyPlugin' } @@ -47,7 +51,9 @@ sub _get_prefix { } sub create_xsd_name { - my ($self,$node) = @_; + my ($self, $node) = @_; + confess "no node $node" if not defined($node) + or $node eq ""; my $name = $self->_resolve_prefix($node) #. '::' . $node->get_name(); return $self->perl_name( $name ); @@ -84,7 +90,7 @@ sub create_interface_name { sub _resolve_prefix { my ($self, $node) = @_; - confess "no node" if not $node; + if ($node->isa('SOAP::WSDL::XSD::Builtin')) { return $self->_get_prefix('type', $node) } @@ -109,6 +115,14 @@ sub perl_name { return $name; } +sub perl_var_name { + my $self = shift; + my $name = shift; + $name =~s{\-}{_}xmsg; + $name =~s{\.}{__}xmsg; + return $name; +} + sub create_subpackage_name { my $self = shift; my $arg_ref = shift; @@ -127,6 +141,7 @@ sub create_subpackage_name { } } # create name for top node + die "FOO" if not defined $top_node; my $top_node_name = $self->create_xsd_name($top_node); my $package_name = join('::_', $top_node_name , (@name_from) ? join('::', @name_from) : () ); return $package_name; @@ -136,6 +151,22 @@ sub create_xmlattr_name { return join '::', shift->create_subpackage_name(shift), 'XmlAttr'; } +sub element_name { + my $self = shift; + my $element = shift; + + my $name = $element->get_name(); + if (! $name) { + while (my $ref = $element->get_ref()) { + $element = $self->get_definitions()->first_types() + ->find_element($element->expand( $ref ) ); + $name = $element->get_name(); + last if ($name); + } + } + return $name; +} + 1; =pod diff --git a/lib/SOAP/WSDL/Generator/Template/XSD.pm b/lib/SOAP/WSDL/Generator/Template/XSD.pm index 6ee045f..8919505 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD.pm +++ b/lib/SOAP/WSDL/Generator/Template/XSD.pm @@ -5,7 +5,7 @@ use Class::Std::Fast::Storable; use File::Basename; use File::Spec; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); use SOAP::WSDL::Generator::Visitor::Typemap; use SOAP::WSDL::Generator::Visitor::Typelib; diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt b/lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt index f60bea7..33d01dc 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt @@ -15,6 +15,8 @@ sub START { $_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy}; $_[0]->set_class_resolver('[% XSD.create_typemap_name(service) %]') if not $_[2]->{class_resolver}; + + $_[0]->set_prefix($_[2]->{use_prefix}) if exists $_[2]->{use_prefix}; } [% binding = definitions.find_binding( port.expand( port.get_binding ) ); @@ -88,4 +90,4 @@ All arguments are forwarded to L. Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %] -=cut \ No newline at end of file +=cut diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt index 76b3b42..0b61dea 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt @@ -40,8 +40,16 @@ methods: =over [% FOREACH element = complexType.get_element -%] -=item * [% element.get_name %] +=item * [% XSD.perl_var_name(XSD.element_name(element)) %] +[% IF (XSD.perl_var_name(XSD.element_name(element)) == element.get_name); %] +[% ELSE %] +Note: The name of this property has been altered, because it didn't match +perl's notion of variable/subroutine names. The altered name is used in +perl code only, XML output uses the original name: + [% element.get_name %] + +[% END %] [% IF element.get_annotation.get_documentation; %] [% element.get_annotation.get_documentation %] [% END -%] diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt index e23cedb..f8499a9 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt @@ -1,7 +1,8 @@ +[% USE XSD -%] { [%- IF complexType.get_name %] # [% XSD.create_xsd_name(complexType) %][% END %] [%- indent = indent _ ' '; FOREACH element = complexType.get_element %] -[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%] +[% indent %][% XSD.perl_var_name(XSD.element_name(element)) %] => [% INCLUDE element/POD/structure.tt -%] [% END %] [% indent.replace('\s{2}$', ''); %]} \ No newline at end of file diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/attributeSet.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/attributeSet.tt index c3fc20c..22b3a1d 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/attributeSet.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/attributeSet.tt @@ -34,4 +34,7 @@ This attribute is of type L<[% XSD.create_xsd_name(type) %]|[% XSD.create_xsd_na [% END %] [%- END -%] + +=back + [% END %] diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt index 85cf9e5..9156ae4 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt @@ -1,9 +1,10 @@ +[%USE XSD -%] [% indent %]{ [%- IF complexType.get_name %] # [% XSD.create_xsd_name(complexType) %][% END %] [%- indent = indent _ ' ' %] [% indent %]# One of the following elements. [% indent %]# No occurance checks yet, so be sure to pass just one... [%- FOREACH element = complexType.get_element %] -[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%] +[% indent %][% XSD.perl_var_name(XSD.element_name(element)) %] => [% INCLUDE element/POD/structure.tt -%] [% END %] [% indent.replace('\s{2}$', ''); %]} \ 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 9711549..593f6f3 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt @@ -7,26 +7,39 @@ Class::Std::initialize(); [% atomic_types = {}; -FOREACH element = complexType.get_element %] -my %[% XSD.perl_name(element.get_name) %]_of :ATTR(:get<[% XSD.perl_name(element.get_name) %]>); +FOREACH element = complexType.get_element; + name = XSD.perl_var_name(XSD.element_name(element)); %] +my %[% XSD.perl_name(name) %]_of :ATTR(:get<[% XSD.perl_name(name) %]>); [%- END %] __PACKAGE__->_factory( - [ qw([% FOREACH element = complexType.get_element %] - [% element.get_name -%] + [ qw([% FOREACH element = complexType.get_element; + + # ugly copied code - macro or plugin method? + name = XSD.perl_var_name(XSD.element_name(element)); -%] + [% name %] [% END %] ) ], { -[% FOREACH element = complexType.get_element -%] - '[% element.get_name %]' => \%[% XSD.perl_name(element.get_name) %]_of, +[% FOREACH element = complexType.get_element; + # ugly copied code - macro or plugin method? + name = XSD.perl_var_name(XSD.element_name(element)); -%] + '[% name %]' => \%[% XSD.perl_name(name) %]_of, [% END -%] }, { [% FOREACH element = complexType.get_element; + IF (ref = element.get_ref); + element = definitions.first_types.find_element(element.expand( element.get_ref )); + END; IF (type = element.get_type); - element_type = definitions.first_types.find_type(complexType.expand( type )); -%] - '[% element.get_name %]' => '[% XSD.create_xsd_name(element_type) %]', -[% ELSE; + element_type = definitions.first_types.find_type(complexType.expand( type )); + IF (! element_type); + type_name = complexType.expand( type ); + THROW NOT_FOUND, "${ type_name.0 } ${ type_name.1 } not found"; + END; -%] + '[% XSD.perl_var_name(XSD.element_name(element)) %]' => '[% XSD.create_xsd_name(element_type) %]', +[% ELSE; IF (element.first_simpleType); atomic_types.${ element.get_name } = element.first_simpleType; ELSIF (element.first_complexType); @@ -34,9 +47,14 @@ __PACKAGE__->_factory( ELSE; THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type for element ${ element.get_name } - don't know what to do with it"; END; %] - '[% element.get_name %]' => '[% XSD.create_subpackage_name({ value => element }) %]', + '[% XSD.perl_var_name(XSD.element_name(element)) %]' => '[% XSD.create_subpackage_name({ value => element }) %]', [% END; END -%] + }, + { +[% FOREACH element = complexType.get_element; %] + '[% XSD.perl_var_name(XSD.element_name(element)); %]' => '[% element.get_name %]', +[%- END %] } ); diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt index da7b5f2..5bf5baf 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt @@ -1,5 +1,7 @@ [% IF (complexType.get_variety == 'restriction'); INCLUDE complexType/restriction.tt(complexType = complexType); +ELSIF (complexType.get_variety == 'extension'); + INCLUDE complexType/extension.tt(complexType = complexType); ELSIF (complexType.get_variety == 'sequence'); INCLUDE complexType/extension.tt(complexType = complexType); ELSIF (complexType.get_variety == 'all'); diff --git a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt index 125529f..df3039a 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt @@ -1,28 +1,68 @@ [% +# +# extension +# +# unfortunately, SOAP::WSDL's speed tweaks don't play well with +# Class::Std's inheritance model. +# +# In Class::Std, all properties are stored in the class, and in objects +# using inheritance in the defining class. +# +# As the speed tweaks directly access the class' data without checking +# inheritance, the simplest way is to resolve complexType extension +# relationships +# +# To capture deep inheritance, extensions must be followed until a non- +# extension base is found +# +# TODO attribute handling is missing +# TODO sort out some better way to handle inheritance -base_name=complexType.expand( complexType.get_base ); +element_list = []; + +# copy complexType ref +base_type = complexType; +base_name=base_type.expand( base_type.get_base ); base_type = definitions.first_types.find_type( base_name ); -element_from = complexType.get_element; +# add a use base for first to setup inheritance +%] +use base qw([% XSD.create_xsd_name( base_type ) %]); +[% +# loop forever +WHILE (1); + # make a copy. We don't want to modify the original list here... + FOREACH element = base_type.get_element.reverse; + element_list.unshift(element); + END; + + # get next base type + IF (base_name=base_type.expand( base_type.get_base )); + # set new base_type + base_type = definitions.first_types.find_type( base_name ); + ELSE; + # exit loop if there is none + BREAK; + END; +END; # -# Sanity check: All original elements must be noted first +# and now the new elements... # -element_list = base_type.get_element; +element_from = complexType.get_element; FOREACH element = element_from; IF element_list.${ loop.index }.get_name != element.get_name; element_list.push( element ); -# THROW WSDL "${element.get_name} not found at position ${ loop.index } in extension type ${ complexType.get_name }"; END; END; +# set derived element list complexType.set_element( element_list ); --%] -use base qw([% XSD.create_xsd_name( base_type ) %]); -[% - INCLUDE complexType/variety.tt(complexType = complexType); +# restore original element list +complexType.set_element( element_from ); + %] \ 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 cb255ce..27685cc 100644 --- a/lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt +++ b/lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt @@ -7,8 +7,8 @@ ELSIF (complexType.get_variety == 'group'); THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType group not implemented yet"; ELSIF (complexType.get_variety == 'choice'); 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 })"; +#ELSIF (complexType.get_variety); +# THROW NOT_IMPLEMENTED, "unknown variety ${ complexType.get_variety } in ${ complexType.get_name } (${ element.get_name })"; ELSE %] # There's no variety - empty complexType diff --git a/lib/SOAP/WSDL/Generator/Visitor.pm b/lib/SOAP/WSDL/Generator/Visitor.pm index c1673dd..e971c43 100644 --- a/lib/SOAP/WSDL/Generator/Visitor.pm +++ b/lib/SOAP/WSDL/Generator/Visitor.pm @@ -3,7 +3,7 @@ use strict; use warnings; use Class::Std::Fast::Storable; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %definitions_of :ATTR(:name :default<()>); my %type_prefix_of :ATTR(:name :default<()>); diff --git a/lib/SOAP/WSDL/Generator/Visitor/Typelib.pm b/lib/SOAP/WSDL/Generator/Visitor/Typelib.pm index a366bfe..5711e90 100644 --- a/lib/SOAP/WSDL/Generator/Visitor/Typelib.pm +++ b/lib/SOAP/WSDL/Generator/Visitor/Typelib.pm @@ -5,7 +5,7 @@ use base qw(SOAP::WSDL::Generator::Visitor SOAP::WSDL::Generator::Template ); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); 1; diff --git a/lib/SOAP/WSDL/Generator/Visitor/Typemap.pm b/lib/SOAP/WSDL/Generator/Visitor/Typemap.pm index 9448917..3557da7 100644 --- a/lib/SOAP/WSDL/Generator/Visitor/Typemap.pm +++ b/lib/SOAP/WSDL/Generator/Visitor/Typemap.pm @@ -5,7 +5,7 @@ use Class::Std::Fast::Storable; use base qw(SOAP::WSDL::Generator::Visitor); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %path_of :ATTR(:name :default<[]>); my %typemap_of :ATTR(:name :default<()>); @@ -32,11 +32,14 @@ sub add_element_path { # 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 . "}" - # . $element->get_name(); + if (my $ref = $element->get_ref() ) { + $element = $self->get_definitions()->first_types()->find_element( + $element->expand($ref) ); + } + my $name = $element->get_name(); + + push @{ $path_of{ ident $self } }, $name; } sub process_referenced_type { @@ -61,14 +64,6 @@ sub process_referenced_type { return $self; } -sub process_atomic_type { - my ( $self, $type, $callback ) = @_; - return if not $type; - - $callback->( $self, $type ); - return $self; -} - sub visit_XSD_Element { my ( $self, $ident, $element ) = ( $_[0], ident $_[0], $_[1] ); @@ -84,9 +79,11 @@ sub visit_XSD_Element { # They all just return if no argument is given, # and return $self on success. SWITCH: { + my $name = $element->get_name(); + if ($element->get_type) { - $self->process_referenced_type( $element->expand( $element->get_type() ) ) - && last; + $self->process_referenced_type( $element->expand( $element->get_type() ) ); + last SWITCH; } # atomic simpleType typemap rule: @@ -106,11 +103,23 @@ sub visit_XSD_Element { my $typeclass = $self->get_resolver()->create_subpackage_name($element); $self->set_typemap_entry($typeclass); - $self->process_atomic_type( $element->first_complexType() - , sub { $_[1]->_accept($_[0]) } ) - && last SWITCH; + if (my $complexType = $element->first_complexType()) { + $complexType->_accept($self); + last SWITCH; + } - # TODO: add element ref handling + # element ref handling + if (my $ref = $element->get_ref()) { + $element = $self->get_definitions()->first_types()->find_element( + $element->expand($ref) ); + # we added a path too much - we should add the path of this + # element instead. + pop @{ $path_of{$ident} }; + $element->_accept($self); + # and we must not pop it off now - thus, just return + return; + } + die "Neither type nor ref in element >". $element->get_name ."<. Don't know what to do." }; # Safety measure. If someone defines a top-level element with @@ -128,6 +137,7 @@ sub visit_XSD_Element { sub visit_XSD_ComplexType { my ($self, $ident, $type) = ($_[0], ident $_[0], $_[1] ); my $variety = $type->get_variety(); + my $derivation = $type->get_derivation(); my $content_model = $type->get_contentModel; return if not $variety; # empty complexType return if ($content_model eq 'simpleContent'); @@ -138,10 +148,16 @@ sub visit_XSD_ComplexType { for (@{ $type->get_element() || [] }) { $_->_accept( $self ); } - return; } + # Only continue for derived types + # Saves a uninitialized warning. + return if not $derivation; - if (grep { $_ eq $variety } qw(restriction extension) ) { + if ($derivation eq 'restriction' ) { + # TODO check and probably correct - this includes + # all base type's elements in a restriction derivation. + # Probably wrong. + # # resolve base / get atomic type and run on elements if (my $type_name = $type->get_base()) { my $subtype = $self->get_definitions() @@ -150,14 +166,19 @@ sub visit_XSD_ComplexType { for (@{ $subtype->get_element() || [] }) { $_->_accept( $self ); } - # that's all for restriction - return if ($variety eq 'restriction'); } } - - warn "unsupported content model $variety found in " - . "complex type " . $type->get_name() - . " - typemap may be incomplete"; + elsif ($derivation eq 'extension' ) { + # resolve base / get atomic type and run on elements + while (my $type_name = $type->get_base()) { + $type = $self->get_definitions() + ->first_types()->find_type( $type->expand($type_name) ); + # visit child elements + for (@{ $type->get_element() || [] }) { + $_->_accept( $self ); + } + } + } } 1; diff --git a/lib/SOAP/WSDL/Manual/Cookbook.pod b/lib/SOAP/WSDL/Manual/Cookbook.pod new file mode 100644 index 0000000..7329d35 --- /dev/null +++ b/lib/SOAP/WSDL/Manual/Cookbook.pod @@ -0,0 +1,133 @@ +=pod + +=head1 NAME + +SOAP::WSDL::Manual::Cookbook - SOAP::WSDL recipes + +=head2 Accessing HTTPS webservices + +You need Crypt::SSLeay installed to access HTTPS webservices. + +=head2 Accessing protected web services + +Passing a username and password, or a client certificate and key, to the +transport layer is highly dependent on the transport backend. The descriptions +below are for HTTP(S) transport usingLWP::UserAgent + +=head3 Accessing HTTP(S) webservices with basic/digest authentication + +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); + }; + +When using SOAP::Transport::HTTP (SOAP::Lite is installed), do the same to +this backend: + + *SOAP::Transport::HTTP::Client::get_basic_credentials = sub { + 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 +keep_alive on the transport backens. + +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 +changes in interface classes. + +=head3 Accessing HTTPS webservices protected by certificate authentication + +You need Crypt::SSLeay installed to access HTTPS webservices. + +See L on how to configure client certificate authentication. + +=head1 XML OUTPUT + +=head2 Outputting namespaces as prefixes + +Q: I need to interface with a SOAP server which doesn't accept the following +format: + + + + + 12345 + + + + +Instead, it requires this: + + + + + 12345 + + + + +How do I do this using SOAP::WSDL? + +A: The following steps are neccessary to achieve this result: + +First, you would need to write a new serializer, which is quite easy, as it +just creates the envelope and calls ->serialize_qualified() on $header and +$body to fill them in. The new serializer has to declare all namespace +prefixes used, the rest is just the same as the original XSD serializer. + +Second, you'd need to overwrite the start_tag method in +L to use +the appropriate prefixes for the body elements. + +In contrast to the original method, it would probably look up the appropriate +prefix from some data set in the serializer class, so this could be the +appropriate place to load SOAP::WSDL::XSD::Typelib::Element and override the +method. + +Something like this should do (without the handling of specialties like empty +or nil elements): + + %PREFIX_OF = { 'http://services.company.com/' => 'ns2' }; + + *SOAP::WSDL::XSD::Typelib::Element::start_tag = sub { + # use prefix instead of xmlns attribute and copy the rest from + # SOAP::WSDL::XSD::Typelib::Element::start_tag + my $prefix = $PREFIX_OF{ $_[0]->get_xmlns() }; + my $name = $_[1]->{ name } || $self->__get_name(); + return "<$prefix:$name>"; + } + +=head1 LICENSE AND COPYRIGHT + +Copyright 2008 Martin Kutter. + +This library is free software. You may distribute/modify it under +the same terms as perl itself + +=head1 AUTHOR + +Martin Kutter Emartin.kutter fen-net.deE + +=head1 REPOSITORY INFORMATION + + $Rev: 583 $ + $LastChangedBy: kutterma $ + $Id: $ + $HeadURL: $ + +=cut \ No newline at end of file diff --git a/lib/SOAP/WSDL/Manual/FAQ.pod b/lib/SOAP/WSDL/Manual/FAQ.pod new file mode 100644 index 0000000..747ac76 --- /dev/null +++ b/lib/SOAP/WSDL/Manual/FAQ.pod @@ -0,0 +1,152 @@ +=pod + +=head1 NAME + +SOAP::WSDL::Manual::FAQ - Frequently Asked Questions (and answers) + +=head1 Development status + +=head2 Can I use SOAP::WSDL in a production environment? + +Yes. SOAP::WSDL is used in production environments. You should - as always - +apply common sense and take appropriate safety measures, especially if +running SOAP::WSDL as a server. + +=head2 Can I throw the WSDL away after generating? + +Please don't. Future versions of SOAP::WSDL may require you to re-generate +interfaces in order to use them. + +=head1 SOAP/WSDL Version and message styles + +=head2 Which SOAP / WSDL versions does SOAP::WSDL support? + +SOAP1.1 and WSDL1.1. SOAP1.2 and WSDL2 are not supported yet. + +=head2 Which SOAP message Styles are supported? + +document/literal. + +The message / encoding styles rpc/encoded and rpc/literal are not supported +(rpc/literal is hardly used). + +rpc/literal is not implemented yet. + +Unfortunately, SOAP::WSDL can't even parse many rpc/encoded WSDL definitions, +and thus cannot inform you about unsupported message styles in some +situations. + +=head1 Aren't rpc variants bad anyway? + +No. They can be as well-defined and useful as the document/literal variant. + +The difference between rpc and document is that rpc SOAP messages have an +additional container named after the remote procedure called. + +rpc/literal is RPC with named parameters, whereas rpc/encoded corresponds to +positional parameters. + +rpc/encoded is prohibited by the WS-I Basic Profile. However, rpc/encoded +is still popular, especially for scripting languages like perl, python or php. + +You should probably use L for rpc/encoded web services. + +All the document/rpc literal/encoded discussion will cede with WSDL2.0: These +variants are dropped in favour of an extensible operation style mechanism. + +=head1 XML Parsing / Generation + +=head2 Does SOAP::WSDL support namespaces? + +Well, sort of. SOAP::WSDL can use WSDL definitions containing namespaces, +and emits SOAP messages with namespace information. + +Its SOAP message parser however, is not namespace sensitive but uses the +pre-shared information from the WSDL for looking up what each XML node means. + +SOAP::WSDL can parse SOAP messages including namespace informations up to the +point where equally named elements from different namespaces may appear at +the same position. + +This is a long-standing feature request and will eventually be resolved. + +=head2 Validation + +=head3 Does SOAP::WSDL perform XML Schema Validation? + +No, SOAP::WSDL does not perform XML Schema Validation. It does, however, +enforce the correct structure on both XML and perl data. Occurrence, ordering, +value-spaces, and identity constraints are not checked. + +=head3 Does SOAP::WSDL perform XML Validation? + +No, SOAP::WSDL does not perform XML Validation (that is, validation against +a DTD). WS-I prohibits the use of DTDs in WSDL definitions. + +=head3 Isn't validation required for XML? + +No. The XML Specification does not require validation from XML processors. +It states how validating and non-validating parsers must react on errors. + +Note: Validation in the context of (only) XML actually means DTD validation. + +=head3 And doesn't XML Schema require validation? + +The XML Schema specification requires conformant XML Schema processors to +be able to validate XML Schema constraints. + +SOAP::WSDL is not a conformant XML Schema processor in this sense, as it does +not validate all XML Schema constraints. + +=head3 And does SOAP require XML Schema Validation? + +No. The SOAP1.1 note does not say anything about validation. The SOAP1.2. +specification explicitly states that XML Schema validation is not required +for the SOAP envelope, and that applications may decide whether they need +XML Schema Validation for the SOAP payload or not. + +The WSDL 1.1. specification does not mandate XML Schema validation. It does +actually not even mandate the use of XML Schema for type definitions. + +=head2 Can SOAP::WSDL parse SOAP message fragments? + +No. SOAP::WSDL can parse neither well-formed nor not-well-formed +SOAP message chunks. + + +=head1 Persistence + +=head2 Can I use Storable to freeze/thaw SOAP::WSDL's objects? + +You can freeze almost all of SOAP::WSDL's objects. The only exceptions are +the objects used in parsing WSDL definitions itself - they cannot be frozen. + +Note that freezing/thawing inside-out objects comes with a performance penalty +and is at around the speed of XML generation/parsing. + +=head1 Performance and memory consumption + +=head2 How fast is SOAP::WSDL? + +As of this writing, SOAP::WSDL is the fastest SOAP Client toolkit for perl +available on CPAN. There are no published server benchmarks yet. + +If you need extra speed you can try SOAP::WSDL_XS available +from SOAP::WSDL's subversion repository at: + +https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL_XS/trunk + +Note however that SOAP::WSDL_XS is not very mature yet and only suitable for +use in trusted environments - you definitely should not use it on a public +internet SOAP server yet. + +Note further that SOAP::WSDL's inside-out objects come with a big performance +penalty when freezing/thawing them with Storable. + +=head2 There's a lot of perl modules generated. Don't they eat up all my +memory? + +SOAP::WSDL usually uses a bit more memory than SOAP::Lite, but less than +XML::Compile. Test if in question. + +=cut diff --git a/lib/SOAP/WSDL/Manual/Glossary.pod b/lib/SOAP/WSDL/Manual/Glossary.pod index 0a88b23..b7cdefb 100644 --- a/lib/SOAP/WSDL/Manual/Glossary.pod +++ b/lib/SOAP/WSDL/Manual/Glossary.pod @@ -93,7 +93,7 @@ Martin Kutter Emartin.kutter fen-net.deE $Rev: 391 $ $LastChangedBy: kutterma $ $Id: Glossary.pod 391 2007-11-17 21:56:13Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Glossary.pod $ + $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Glossary.pod $ =cut diff --git a/lib/SOAP/WSDL/Manual/Parser.pod b/lib/SOAP/WSDL/Manual/Parser.pod index 82b8915..4bace0d 100644 --- a/lib/SOAP/WSDL/Manual/Parser.pod +++ b/lib/SOAP/WSDL/Manual/Parser.pod @@ -241,7 +241,7 @@ Martin Kutter Emartin.kutter fen-net.deE $Rev: 391 $ $LastChangedBy: kutterma $ $Id: Parser.pod 391 2007-11-17 21:56:13Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Parser.pod $ + $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Parser.pod $ =cut diff --git a/lib/SOAP/WSDL/Manual/WS_I.pod b/lib/SOAP/WSDL/Manual/WS_I.pod index cdd31f5..afc17cc 100644 --- a/lib/SOAP/WSDL/Manual/WS_I.pod +++ b/lib/SOAP/WSDL/Manual/WS_I.pod @@ -1255,7 +1255,7 @@ Martin Kutter Emartin.kutter fen-net.deE $Rev: 562 $ $LastChangedBy: kutterma $ $Id: WS_I.pod 562 2008-02-22 20:32:17Z kutterma $ - $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $ + $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $ =cut diff --git a/lib/SOAP/WSDL/Message.pm b/lib/SOAP/WSDL/Message.pm index fcab1b7..802a228 100644 --- a/lib/SOAP/WSDL/Message.pm +++ b/lib/SOAP/WSDL/Message.pm @@ -4,7 +4,7 @@ use warnings; use Class::Std::Fast::Storable; use base qw(SOAP::WSDL::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %part_of :ATTR(:name :default<[]>); diff --git a/lib/SOAP/WSDL/OpMessage.pm b/lib/SOAP/WSDL/OpMessage.pm index 8005d3c..b5a4006 100644 --- a/lib/SOAP/WSDL/OpMessage.pm +++ b/lib/SOAP/WSDL/OpMessage.pm @@ -4,7 +4,7 @@ use warnings; use Class::Std::Fast::Storable; use base qw(SOAP::WSDL::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %body_of :ATTR(:name :default<[]>); my %header_of :ATTR(:name
:default<[]>); diff --git a/lib/SOAP/WSDL/Operation.pm b/lib/SOAP/WSDL/Operation.pm index 047f10e..c45ebce 100644 --- a/lib/SOAP/WSDL/Operation.pm +++ b/lib/SOAP/WSDL/Operation.pm @@ -4,7 +4,7 @@ use warnings; use Class::Std::Fast::Storable; use base qw(SOAP::WSDL::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); 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 ce639b5..d65c917 100644 --- a/lib/SOAP/WSDL/Part.pm +++ b/lib/SOAP/WSDL/Part.pm @@ -6,7 +6,7 @@ use Class::Std::Fast::Storable; use base qw(SOAP::WSDL::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %element_of :ATTR(:name :default<()>); my %type_of :ATTR(:name :default<()>); diff --git a/lib/SOAP/WSDL/Port.pm b/lib/SOAP/WSDL/Port.pm index 680f2e1..c8d255f 100644 --- a/lib/SOAP/WSDL/Port.pm +++ b/lib/SOAP/WSDL/Port.pm @@ -4,7 +4,7 @@ use warnings; use Class::Std::Fast::Storable; use base qw(SOAP::WSDL::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %binding_of :ATTR(:name :default<()>); my %address_of :ATTR(:name
:default<()>); diff --git a/lib/SOAP/WSDL/PortType.pm b/lib/SOAP/WSDL/PortType.pm index 130e93b..fd5d41a 100644 --- a/lib/SOAP/WSDL/PortType.pm +++ b/lib/SOAP/WSDL/PortType.pm @@ -4,7 +4,7 @@ use warnings; use Class::Std::Fast::Storable; use base qw(SOAP::WSDL::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %operation_of :ATTR(:name :default<()>); diff --git a/lib/SOAP/WSDL/SOAP/Address.pm b/lib/SOAP/WSDL/SOAP/Address.pm index e739a00..b1ddb7d 100644 --- a/lib/SOAP/WSDL/SOAP/Address.pm +++ b/lib/SOAP/WSDL/SOAP/Address.pm @@ -4,7 +4,7 @@ use warnings; use base qw(SOAP::WSDL::Base); use Class::Std::Fast::Storable; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %location :ATTR(:name :default<()>); 1; \ No newline at end of file diff --git a/lib/SOAP/WSDL/SOAP/Body.pm b/lib/SOAP/WSDL/SOAP/Body.pm index 4ce691a..36ca918 100644 --- a/lib/SOAP/WSDL/SOAP/Body.pm +++ b/lib/SOAP/WSDL/SOAP/Body.pm @@ -4,7 +4,7 @@ use warnings; use base qw(SOAP::WSDL::Base); use Class::Std::Fast::Storable; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %use_of :ATTR(:name :default); my %namespace_of :ATTR(:name :default); diff --git a/lib/SOAP/WSDL/SOAP/Header.pm b/lib/SOAP/WSDL/SOAP/Header.pm index 52f9e06..4e39cae 100644 --- a/lib/SOAP/WSDL/SOAP/Header.pm +++ b/lib/SOAP/WSDL/SOAP/Header.pm @@ -4,7 +4,7 @@ use warnings; use base qw(SOAP::WSDL::Base); use Class::Std::Fast::Storable; -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %use_of :ATTR(:name :default); my %namespace_of :ATTR(:name :default); diff --git a/lib/SOAP/WSDL/SOAP/HeaderFault.pm b/lib/SOAP/WSDL/SOAP/HeaderFault.pm index 6a59bf2..dd54dca 100644 --- a/lib/SOAP/WSDL/SOAP/HeaderFault.pm +++ b/lib/SOAP/WSDL/SOAP/HeaderFault.pm @@ -3,6 +3,6 @@ use strict; use warnings; use base qw(SOAP::WSDL::Header); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); 1; \ No newline at end of file diff --git a/lib/SOAP/WSDL/SOAP/Operation.pm b/lib/SOAP/WSDL/SOAP/Operation.pm index 49b4d96..727cc66 100644 --- a/lib/SOAP/WSDL/SOAP/Operation.pm +++ b/lib/SOAP/WSDL/SOAP/Operation.pm @@ -4,7 +4,7 @@ use warnings; use Class::Std::Fast::Storable; use base qw(SOAP::WSDL::Base); -use version; our $VERSION = qv('2.00.01'); +use version; our $VERSION = qv('2.00.02'); my %style_of :ATTR(:name