Compare commits

..

5 Commits

Author SHA1 Message Date
Martin Kutter
b955c5ad79 import SOAP-WSDL 2.00_23 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_23
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_23.tar.gz
2009-12-12 19:48:07 -08:00
Martin Kutter
080b211e4e import SOAP-WSDL 2.00_22 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_22
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_22.tar.gz
2009-12-12 19:48:06 -08:00
Martin Kutter
fa4d5dd884 import SOAP-WSDL 2.00_20 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_20
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_20.tar.gz
2009-12-12 19:48:05 -08:00
Martin Kutter
3d11524449 import SOAP-WSDL 2.00_19 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_19
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_19.tar.gz
2009-12-12 19:48:04 -08:00
Martin Kutter
21efa286af import SOAP-WSDL 2.00_18 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_18
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_18.tar.gz
2009-12-12 19:48:03 -08:00
63 changed files with 875 additions and 555 deletions

View File

@@ -4,13 +4,17 @@ $build = Module::Build->new(
create_makefile_pl => 'passthrough',
dist_abstract => 'SOAP with WSDL support',
dist_name => 'SOAP-WSDL',
dist_version => '2.00_17',
dist_version => '2.00_23',
module_name => 'SOAP::WSDL',
license => 'artistic',
requires => {
'Class::Std' => q/v0.0.8/,
# 5.6.x is way too buggy and has no unicode support
# for us. SOAP-WSDL relies on unicode (WS-I demands it)
# and triggers several 5.6 bugs...
'perl' => '5.8.0',
'Class::Std' => q/v0.0.8/,
'Class::Std::Storable' => 0,
'Data::Dumper' => 0,
'Data::Dumper' => 0,
'Date::Parse' => 0,
'Date::Format' => 0,
'File::Basename' => 0,
@@ -25,7 +29,7 @@ $build = Module::Build->new(
buildrequires => {
'Class::Std' => q/v0.0.8/,
'Class::Std::Storable' => 0,
'Cwd' => 0,
'Cwd' => 0,
'Date::Parse' => 0,
'Date::Format' => 0,
'Getopt::Long' => 0,
@@ -33,13 +37,18 @@ $build = Module::Build->new(
'LWP::UserAgent' => 0,
'File::Basename' => 0,
'File::Path' => 0,
'File::Spec' => 0,
'File::Spec' => 0,
'Storable' => 0,
'Test::More' => 0,
'Template' => 0,
'XML::Parser::Expat' => 0,
},
recursive_test_files => 1,
meta_add => {
no_index => {
directory => 'lib/SOAP/WSDL/Generator/Template/XSD/',
},
}
);
$build->add_build_element('tt');
$build->create_build_script;

105
CHANGES
View File

@@ -1,4 +1,4 @@
Release notes for SOAP::WSDL 2.00_17
Release notes for SOAP::WSDL 2.00_23
-------
I'm proud to present a new pre-release version of SOAP::WSDL.
@@ -20,7 +20,7 @@ Features:
the module's internals
* Thorough test suite
o SOAP::WSDL is heavily regression tested, with a test coverage of
over 90%.
over 95%.
* SOAP::Lite like look and feel
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations
* XML schema based class library for creating data objects
@@ -33,6 +33,105 @@ Features:
The following changes have been made:
2.00_23
---
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):
* [ 1826382 ] nillable elements not serialized as xsi:nil
* [ 1826337 ] Second element in complexType gets eaten up
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
The following uncategorized improvements have been made:
* Test for complexType containing element with atomic simpleType added
2.00_22
----
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):
* [ 1817697 ] Dots in service/port names lead to broken interfaces
* [ 1817699 ] Templates not found on all OS
The following uncategorized improvements have been made:
* Code cleanup. The XSD library has been cleaned up a bit. Should result
in a minor speedup in serializing and deserializing XML messages,
2.00_21 - not released
----
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):
* [ 1810058 ] .tt's pod indexed on CPAN (again)
* [ 1809284 ] Rename SOAP::WSDL::Deserializer::SOAP11 to ::XSD
The following uncategorized improvements have been made:
* Requires at least perl 5.8.0. This is due to a bug in perls before -
see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746
2.00_20
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1815646 ] Only include last part of port name in interface
* [ 1815648 ] Methods with empty body cannot be called as ->method()
* [ 1815651 ] Empty complexType definitions not supported
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):
* [ 1815643 ] ComplexTypes cannot be freezed/thawed
The following uncategorized improvements have been made:
* WSDL definitions are decoded into utf8
* fixed tests to use correct path on windows
2.00_19
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1810395 ] Implement complexType complexContent extension
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):
* [ 1813144 ] Typemap not used in interface class
* [ 1810058 ] .tt's pod indexed on CPAN
The following uncategorized improvements have been made:
* Documentation improvements
2.00_18
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1790983 ] Create generator Plugin API
Generator factory is SOAP::WSDL::Factory::Generator
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):
* [ 1805252 ] t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t fails
The default timezone conversion has been fixed.
The following uncategorized improvements have been made:
* Documentation improvements
* Test updates
* readable() has been converted into a no-op, as it already had no effect
any more
2.00_17
----
The following features were added (the numbers in square brackets are the
@@ -116,7 +215,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1797678 ] Move Code generator from WSDL::Definitions to separate class
* [ 1803330 ] Create one interface per port
SOAP::WSDL now creats one interface per port, not one per service.
SOAP::WSDL now creates one interface per port, not one per service.
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):

View File

@@ -40,7 +40,7 @@ lib/SOAP/WSDL/Client.pm
lib/SOAP/WSDL/Client/Base.pm
lib/SOAP/WSDL/Definitions.pm
lib/SOAP/WSDL/Deserializer/Hash.pm
lib/SOAP/WSDL/Deserializer/SOAP11.pm
lib/SOAP/WSDL/Deserializer/XSD.pm
lib/SOAP/WSDL/Deserializer/SOM.pm
lib/SOAP/WSDL/Expat/Base.pm
lib/SOAP/WSDL/Expat/Message2Hash.pm
@@ -48,6 +48,7 @@ lib/SOAP/WSDL/Expat/MessageParser.pm
lib/SOAP/WSDL/Expat/MessageStreamParser.pm
lib/SOAP/WSDL/Expat/WSDLParser.pm
lib/SOAP/WSDL/Factory/Deserializer.pm
lib/SOAP/WSDL/Factory/Generator.pm
lib/SOAP/WSDL/Factory/Serializer.pm
lib/SOAP/WSDL/Factory/Transport.pm
lib/SOAP/WSDL/Generator/Template.pm
@@ -58,12 +59,14 @@ lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt
lib/SOAP/WSDL/Generator/Template/XSD/element.tt
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt
lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt
@@ -90,16 +93,16 @@ lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
lib/SOAP/WSDL/Manual.pod
lib/SOAP/WSDL/Manual/Glossary.pod
lib/SOAP/WSDL/Manual/Parser.pod
lib/SOAP/WSDL/Manual/WS_I.pod
lib/SOAP/WSDL/Manual/XSD.pod
lib/SOAP/WSDL/Message.pm
lib/SOAP/WSDL/Operation.pm
lib/SOAP/WSDL/OpMessage.pm
lib/SOAP/WSDL/Parser.pod
lib/SOAP/WSDL/Part.pm
lib/SOAP/WSDL/Port.pm
lib/SOAP/WSDL/PortType.pm
lib/SOAP/WSDL/Serializer/SOAP11.pm
lib/SOAP/WSDL/Serializer/XSD.pm
lib/SOAP/WSDL/Service.pm
lib/SOAP/WSDL/SOAP/Address.pm
lib/SOAP/WSDL/SOAP/Body.pm
@@ -262,6 +265,7 @@ t/SOAP/WSDL/Factory/Transport.t
t/SOAP/WSDL/Generator/Template.t
t/SOAP/WSDL/Generator/Visitor.t
t/SOAP/WSDL/Generator/Visitor/Typemap.t
t/SOAP/WSDL/Generator/XCS.t
t/SOAP/WSDL/Generator/XSD.t
t/SOAP/WSDL/Generator/XSD_unsupported.t
t/SOAP/WSDL/Transport/01_Test.t

View File

@@ -1,6 +1,6 @@
---
name: SOAP-WSDL
version: 2.00_17
version: 2.00_23
author: []
abstract: SOAP with WSDL support
license: artistic
@@ -20,6 +20,7 @@ requires:
Template: 0
Term::ReadKey: 0
XML::Parser::Expat: 0
perl: 5.8.0
provides:
SOAP::WSDL:
file: lib/SOAP/WSDL.pm
@@ -41,12 +42,12 @@ provides:
SOAP::WSDL::Deserializer::Hash:
file: lib/SOAP/WSDL/Deserializer/Hash.pm
version: 2.00_17
SOAP::WSDL::Deserializer::SOAP11:
file: lib/SOAP/WSDL/Deserializer/SOAP11.pm
version: 2.00_17
SOAP::WSDL::Deserializer::SOM:
file: lib/SOAP/WSDL/Deserializer/SOM.pm
version: 2.00_15
SOAP::WSDL::Deserializer::XSD:
file: lib/SOAP/WSDL/Deserializer/XSD.pm
version: 2.00_21
SOAP::WSDL::Expat::Base:
file: lib/SOAP/WSDL/Expat/Base.pm
SOAP::WSDL::Expat::Message2Hash:
@@ -57,6 +58,9 @@ provides:
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
SOAP::WSDL::Factory::Deserializer:
file: lib/SOAP/WSDL/Factory/Deserializer.pm
SOAP::WSDL::Factory::Generator:
file: lib/SOAP/WSDL/Factory/Generator.pm
version: 2.00_18
SOAP::WSDL::Factory::Serializer:
file: lib/SOAP/WSDL/Factory/Serializer.pm
version: 2.00_17
@@ -101,9 +105,9 @@ provides:
SOAP::WSDL::SOAP::Typelib::Fault11:
file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
version: 2.00_17
SOAP::WSDL::Serializer::SOAP11:
file: lib/SOAP/WSDL/Serializer/SOAP11.pm
version: 2.00_13
SOAP::WSDL::Serializer::XSD:
file: lib/SOAP/WSDL/Serializer/XSD.pm
version: 2.00_21
SOAP::WSDL::Service:
file: lib/SOAP/WSDL/Service.pm
SOAP::WSDL::Transport::HTTP:
@@ -125,7 +129,7 @@ provides:
version: 2.00_17
SOAP::WSDL::XSD::Element:
file: lib/SOAP/WSDL/XSD/Element.pm
version: 2.00_17
version: 2.00_22
SOAP::WSDL::XSD::Schema:
file: lib/SOAP/WSDL/XSD/Schema.pm
SOAP::WSDL::XSD::Schema::Builtin:
@@ -219,6 +223,7 @@ provides:
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_18
SOAP::WSDL::XSD::Typelib::Builtin::token:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte:
@@ -231,9 +236,10 @@ provides:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
SOAP::WSDL::XSD::Typelib::ComplexType:
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
version: 2.00_16
version: 2.00_23
SOAP::WSDL::XSD::Typelib::Element:
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
version: 2.00_23
SOAP::WSDL::XSD::Typelib::SimpleType:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
@@ -242,3 +248,5 @@ 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/

1
TODO
View File

@@ -2,7 +2,6 @@ TODO list for SOAP::WSDL
2.00 Pre-releases
--------
* Implement a Generator Plugin API
* Implement a interface similar to SOAP::Schema (#1783639)

View File

@@ -1,5 +1,6 @@
#!/usr/bin/perl -w
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
use strict;
use warnings;
use lib '../lib';
@@ -7,7 +8,7 @@ use lib 'lib';
use lib '../t/lib';
# use SOAP::WSDL::SAX::MessageHandler;
use Benchmark;
use Benchmark qw(cmpthese timethese);
use SOAP::WSDL::Expat::MessageParser;
use SOAP::WSDL::Expat::Message2Hash;
use XML::Simple;
@@ -18,8 +19,9 @@ use MySimpleType;
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body><MyAtomicComplexTypeElement xmlns="urn:Test" >
<test>Test</test>
<SOAP-ENV:Body>
<MyAtomicComplexTypeElement xmlns="urn:Test" >
<test>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
@@ -32,22 +34,13 @@ my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test>Test</test>
<test>Test</test>
<test>Test</test>
<test>Test</test>
<test>Test</test>
<test>Test</test>
<test>Test</test>
<test>Test</test>
<test>Test</test>
<test>Test</test>
<test>Test</test>
<test2 >Test55</test2>
</test>
</MyAtomicComplexTypeElement>
</SOAP-ENV:Body></SOAP-ENV:Envelope>};
my $parser = SOAP::WSDL::Expat::MessageParser->new({
class_resolver => 'FakeResolver'
});
@@ -56,32 +49,70 @@ my $hash_parser = SOAP::WSDL::Expat::Message2Hash->new();
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
print "xml length: ${ \length $xml } bytes\n";
my $libxml = XML::LibXML->new();
$libxml->keep_blanks(0);
my @data;
timethese 10000,
{
'Hash (SOAP:WSDL)' => sub { push @data, $hash_parser->parse( $xml ) },
'XSD (SOAP::WSDL)' => sub { push @data, $parser->parse( $xml ) },
'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
# 'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
sub libxml_test {
my $dom = $libxml->parse_string( $xml );
push @data, dom2hash( $dom->firstChild );
};
# use Test::More tests => 1;
#is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test" >}
# . q{<test >Test</test><test2 >Test2</test2></MyAtomicComplexTypeElement>}
# , 'Content comparison';
sub dom2hash {
for ($_[0]->childNodes) {
if (exists $_[1]->{ $_->nodeName }) {
if (ref $_[1]->{ $_->nodeName } eq 'ARRAY') {
if ($_->nodeName eq '#text') {
push @{ $_[1] } ,$_->textContent;
}
else {
push @{ $_[1]->{ $_->nodeName } }, dom2hash( $_, {} );
}
}
else {
if ($_->nodeName eq '#text') {
$_[1] = [ $_[1], $_->textContent() ];
}
else {
$_[1]->{ $_->nodeName } = [ $_[1]->{ $_->nodeName } ,
dom2hash( $_, {} ) ];
}
}
}
else {
if ($_->nodeName eq '#text') {
$_[1] = $_->textContent();
}
else {
$_[1]->{ $_->nodeName } = dom2hash( $_, {} );
}
}
}
return $_[1];
}
#$parser->class_resolver( 'FakeResolver2' );
cmpthese 5000,
{
'SOAP::WSDL (Hash)' => sub { push @data, $hash_parser->parse( $xml ) },
'SOAP::WSDL (XSD)' => sub { push @data, $parser->parse( $xml ) },
'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
'XML::LibXML (Hash)' => \&libxml_test,
};
# for (1..10000) { push @data, $parser->parse( $xml ) };
# data classes reside in t/lib/Typelib/
BEGIN {
package FakeResolver;
{
my %class_list = (
'MyAtomicComplexTypeElement' => 'MyAtomicComplexTypeElement',
'MyAtomicComplexTypeElement/test' => 'MyTestElement',
'MyAtomicComplexTypeElement/test2' => 'MyTestElement2',
'MyAtomicComplexTypeElement/test' => 'MyAtomicComplexTypeElement',
'MyAtomicComplexTypeElement/test/test2' => 'MyTestElement2',
);
sub get_map { return \%class_list };

View File

@@ -8,14 +8,5 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anyType->new();
timethese 10000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anyType->new() },
'new with params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anyType->new({
xmlns => 'urn:Test'
}) },
'set_FOO' => sub { $obj->set_xmlns('Test') },
};
my $data;
timethese 1000000, {
'set_FOO' => sub { $obj->set_xmlns('Test') },
'get_FOO' => sub { $data = $obj->get_xmlns() },
};

View File

@@ -9,14 +9,13 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
timethese 10000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() },
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
xmlns => 'urn:Test',
value => 'Teststring'
}) },
'set_FOO' => sub { $obj->set_xmlns('Test') },
'set_FOO' => sub { $obj->set_value('Test') },
};
my $data;
timethese 1000000, {
'set_FOO' => sub { $obj->set_xmlns('Test') },
'get_FOO' => sub { $data = $obj->get_xmlns() },
'set_FOO' => sub { $obj->set_value('Test') },
'get_FOO' => sub { $data = $obj->get_value() },
};

View File

@@ -6,17 +6,20 @@ use SOAP::WSDL::XSD::Typelib::Builtin::string;
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
timethese 10000, {
timethese 20000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() },
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({
xmlns => 'urn:Test',
value => 'Teststring'
}) },
'set_FOO' => sub { $obj->set_xmlns('Test') },
};
$obj->set_value('Foobar');
timethese 20000, {
serialize => sub { $obj->serialize() }
};
my $data;
timethese 1000000, {
'set_FOO' => sub { $obj->set_xmlns('Test') },
'get_FOO' => sub { $data = $obj->get_xmlns() },
'set_FOO' => sub { $obj->set_value('Test') },
'get_FOO' => sub { $data = $obj->get_value() },
};

View File

@@ -1,324 +1,5 @@
================ SmallProf version 2.02 ================
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 1
Profile of -e Page 1
=================================================================
count wall tm cpu time line
0 0.00000 0.00000 1:#!/usr/bin/perl
0 0.00000 0.00000 2:package SOAP::WSDL::Expat::MessageParser;
0 0.00000 0.00000 3:use strict;
0 0.00000 0.00000 4:use warnings;
0 0.00000 0.00000 5:use SOAP::WSDL::XSD::Typelib::Builtin;
0 0.00000 0.00000 6:use XML::Parser::Expat;
0 0.00000 0.00000 7:
0 0.00000 0.00000 8:sub new {
1 0.00000 0.00000 9: my ($class, $args) = @_;
0 0.00000 0.00000 10: my $self = {
0 0.00000 0.00000 11: class_resolver => $args->{
1 0.00001 0.00000 12: strict => exists $args->{ strict } ?
0 0.00000 0.00000 13: };
1 0.00001 0.00000 14: bless $self, $class;
1 0.02383 0.02000 15: return $self;
0 0.00000 0.00000 16:}
0 0.00000 0.00000 17:
0 0.00000 0.00000 18:sub class_resolver {
0 0.00000 0.00000 19: my $self = shift;
0 0.00000 0.00000 20: $self->{ class_resolver } = shift;
0 0.00000 0.00000 21: return;
0 0.00000 0.00000 22:}
0 0.00000 0.00000 23:
0 0.00000 0.00000 24:sub _initialize {
1000 0.00098 0.01000 25: my ($self, $parser) = @_;
1000 0.04304 0.02000 26: $self->{ parser } = $parser;
0 0.00000 0.00000 27:
1000 0.00140 0.01000 28: delete $self->{ data };
0 0.00000 0.00000 29:
1000 0.00042 0.03000 30: my $characters;
0 0.00000 0.00000 31: #my @characters_from = ();
1000 0.00059 0.00000 32: my $current = undef;
1000 0.00093 0.00000 33: my $list = []; #
1000 0.00065 0.02000 34: my $path = []; #
1000 0.00064 0.02000 35: my $skip = 0; #
1000 0.00049 0.01000 36: my $current_part = q{}; # are
0 0.00000 0.00000 37:
1000 0.00041 0.00000 38: my $depth = 0;
0 0.00000 0.00000 39:
0 0.00000 0.00000 40: my %content_check = $self->{strict}
0 0.00000 0.00000 41: ? (
0 0.00000 0.00000 42: 0 => sub {
1000 0.00115 0.00000 43: die "Bad top node $_[1]"
1000 0.01666 0.03000 44: die "Bad namespace for
0 0.00000 0.00000 45: if $_[0]-
1000 0.00051 0.02000 46: $depth++;
1000 0.00413 0.01000 47: return;
0 0.00000 0.00000 48: },
0 0.00000 0.00000 49: 1 => sub {
1000 0.00050 0.02000 50: $depth++;
1000 0.03690 0.04000 51: return;
0 0.00000 0.00000 52: }
0 0.00000 0.00000 53: )
1000 0.01120 0.03000 54: : ();
0 0.00000 0.00000 55:
0 0.00000 0.00000 56: my $char_handler = sub {
================ SmallProf version 2.02 ================
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 2
=================================================================
count wall tm cpu time line
0 0.00000 0.00000 57: # push @characters_from, $_[1] if
80000 0.19296 1.00000 58: $characters .= $_[1] if $_[1]
0 0.00000 0.00000 59:
80000 0.27660 0.97000 60: return;
1000 0.00449 0.00000 61: };
0 0.00000 0.00000 62:
0 0.00000 0.00000 63: # use "globals" for speed
1000 0.00162 0.01000 64: my ($_prefix, $_method,
0 0.00000 0.00000 65: $_class) = ();
0 0.00000 0.00000 66:
0 0.00000 0.00000 67: no strict qw(refs);
0 0.00000 0.00000 68: $parser->setHandlers(
0 0.00000 0.00000 69: Start => sub {
0 0.00000 0.00000 70: # my ($parser, $element, %_attrs)
0 0.00000 0.00000 71: # $depth = $parser->depth();
0 0.00000 0.00000 72:
0 0.00000 0.00000 73: # call methods without using
0 0.00000 0.00000 74: # That's slightly faster than
0 0.00000 0.00000 75: # and we don't have to pass $_[1]
0 0.00000 0.00000 76: # Yup, that's dirty.
28000 0.03037 0.32000 77: return &{$content_check{ $depth
0 0.00000 0.00000 78:
26000 0.02735 0.15000 79: push @{ $path }, $_[1]; #
26000 0.01366 0.29000 80: return if $skip; #
0 0.00000 0.00000 81:
0 0.00000 0.00000 82: # resolve class of this element
0 0.00000 0.00000 83: $_class = $self->{ class_resolver
0 0.00000 0.00000 84: or die "Cannot resolve class
26000 0.28196 0.56000 85: . join('/', @{ $path }) .
0 0.00000 0.00000 86:
26000 0.01695 0.35000 87: if ($_class eq '__SKIP__') {
0 0.00000 0.00000 88: $skip = join('/', @{ $path
0 0.00000 0.00000 89: $self->setHandlers( Char =>
0 0.00000 0.00000 90: return;
0 0.00000 0.00000 91: }
0 0.00000 0.00000 92:
26000 0.02064 0.35000 93: push @$list, $current; # step
0 0.00000 0.00000 94:
26000 0.02021 0.23000 95: $characters = q(); # empty
0 0.00000 0.00000 96: #@characters_from = ();
0 0.00000 0.00000 97:
0 0.00000 0.00000 98: # Check whether we have a builtin
0 0.00000 0.00000 99: # We could replace this with
0 0.00000 0.00000 100: # match is a bit faster if the
0 0.00000 0.00000 101: # if $class matches...
26000 0.01676 0.21000 102: if (index $_class,
0 0.00000 0.00000 103: # check wheter there is a
0 0.00000 0.00000 104: # or a "new" method
0 0.00000 0.00000 105: # If not, require it - all
0 0.00000 0.00000 106: # define new()
0 0.00000 0.00000 107: # This is not exactly the
0 0.00000 0.00000 108: defined *{ "$_class\::new" }{
26000 0.07804 0.33000 109: or scalar @{ *{
0 0.00000 0.00000 110: or eval "require $_class"
0 0.00000 0.00000 111: or die $@;
0 0.00000 0.00000 112: }
================ SmallProf version 2.02 ================
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 3
=================================================================
count wall tm cpu time line
0 0.00000 0.00000 113:
26000 0.45038 0.81000 114: $current = $_class->new({
0 0.00000 0.00000 115:
0 0.00000 0.00000 116: # remember top level element
0 0.00000 0.00000 117: exists $self->{ data }
26000 0.02113 0.22000 118: or ($self->{ data } =
26000 0.01267 0.25000 119: $depth++;
26000 0.07978 0.40000 120: return;
0 0.00000 0.00000 121: },
0 0.00000 0.00000 122:
0 0.00000 0.00000 123: Char => $char_handler,
0 0.00000 0.00000 124:
0 0.00000 0.00000 125: End => sub {
0 0.00000 0.00000 126:
28000 0.01974 0.26000 127: pop @{ $path };
0 0.00000 0.00000 128:
28000 0.01197 0.18000 129: if ($skip) {
0 0.00000 0.00000 130: return if $skip ne join '/',
0 0.00000 0.00000 131: $skip = 0;
0 0.00000 0.00000 132: $_[0]->setHandler( Char =>
0 0.00000 0.00000 133: return;
0 0.00000 0.00000 134: }
0 0.00000 0.00000 135:
28000 0.01687 0.25000 136: $depth--;
0 0.00000 0.00000 137:
0 0.00000 0.00000 138: # This one easily handles ignores
28000 0.10769 0.33000 139: return if not ref $list->[-1];
0 0.00000 0.00000 140:
0 0.00000 0.00000 141: # set characters in current if we
0 0.00000 0.00000 142: # we may have characters in
0 0.00000 0.00000 143: # too - maybe we should rely on
0 0.00000 0.00000 144: # may get a speedup by defining a
0 0.00000 0.00000 145: # and looking it up via exists
0 0.00000 0.00000 146:# if ( $current-
0 0.00000 0.00000 147:# $current->set_value(
0 0.00000 0.00000 148:# }
0 0.00000 0.00000 149: # currently doesn't work, as
0 0.00000 0.00000 150: # maybe change ?
25000 0.21156 0.56000 151: $current->set_value( $characters
0 0.00000 0.00000 152: #$current->set_value( join
25000 0.08260 0.32000 153: $characters = q{};
0 0.00000 0.00000 154:# undef @characters_from;
0 0.00000 0.00000 155: # set appropriate attribute in
0 0.00000 0.00000 156: # multiple values must be
0 0.00000 0.00000 157: #$_method = "add_$_localname";
25000 0.01494 0.21000 158: $_method = "add_$_[1]";
25000 0.55155 0.86000 159: $list->[-1]->$_method( $current
0 0.00000 0.00000 160:
25000 0.02121 0.14000 161: $current = pop @$list;
25000 0.07002 0.34000 162: return;
0 0.00000 0.00000 163: }
1000 0.12135 0.08000 164: );
1000 0.13602 0.11000 165: return $parser;
0 0.00000 0.00000 166:}
0 0.00000 0.00000 167:
0 0.00000 0.00000 168:sub parse {
================ SmallProf version 2.02 ================
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 4
=================================================================
count wall tm cpu time line
1000 0.00055 0.03000 169: eval {
1000 0.07420 0.07000 170: $_[0]->_initialize(
0 0.00000 0.00000 171: XML::Parser::Expat->new(
0 0.00000 0.00000 172: Namespaces => 1
0 0.00000 0.00000 173: )
0 0.00000 0.00000 174: )->parse( $_[1] );
1000 0.01030 0.02000 175: $_[0]->{ parser }->release();
0 0.00000 0.00000 176: };
1000 0.00034 0.00000 177: die $@ if $@;
1000 2.73620 2.67000 178: return $_[0]->{ data };
0 0.00000 0.00000 179:}
0 0.00000 0.00000 180:
0 0.00000 0.00000 181:sub parsefile {
0 0.00000 0.00000 182: eval {
0 0.00000 0.00000 183: $_[0]->_initialize(
0 0.00000 0.00000 184: $_[0]->{ parser }->release();
0 0.00000 0.00000 185: };
0 0.00000 0.00000 186: die $@, $_[1] if $@;
0 0.00000 0.00000 187: return $_[0]->{ data };
0 0.00000 0.00000 188:}
0 0.00000 0.00000 189:
0 0.00000 0.00000 190:# SAX-like aliases
0 0.00000 0.00000 191:sub parse_string;
0 0.00000 0.00000 192:*parse_string = \&parse;
0 0.00000 0.00000 193:
0 0.00000 0.00000 194:sub parse_file;
0 0.00000 0.00000 195:*parse_file = \&parsefile;
0 0.00000 0.00000 196:
0 0.00000 0.00000 197:sub get_data {
0 0.00000 0.00000 198: return $_[0]->{ data };
0 0.00000 0.00000 199:}
0 0.00000 0.00000 200:
0 0.00000 0.00000 201:1;
0 0.00000 0.00000 202:
0 0.00000 0.00000 203:=pod
================ SmallProf version 2.02 ================
Profile of 01_expat.t Page 5
=================================================================
count wall tm cpu time line
0 0.00000 0.00000 1:#!/usr/bin/perl -w
1 0.00003 0.00000 2:%DB::packages=(SOAP::WSDL::Expat::MessagePars
0 0.00000 0.00000 3:use strict;
0 0.00000 0.00000 4:use warnings;
0 0.00000 0.00000 5:use lib '../lib';
0 0.00000 0.00000 6:use lib 'lib';
0 0.00000 0.00000 7:use lib '../t/lib';
0 0.00000 0.00000 8:use SOAP::WSDL::SAX::MessageHandler;
0 0.00000 0.00000 9:
0 0.00000 0.00000 10:use Benchmark;
0 0.00000 0.00000 11:use SOAP::WSDL::Expat::MessageParser;
0 0.00000 0.00000 12:use SOAP::WSDL::Expat::Message2Hash;
0 0.00000 0.00000 13:use XML::Simple;
0 0.00000 0.00000 14:use XML::LibXML;
0 0.00000 0.00000 15:use MyComplexType;
0 0.00000 0.00000 16:use MyElement;
0 0.00000 0.00000 17:use MySimpleType;
0 0.00000 0.00000 18:
0 0.00000 0.00000 19:my $xml = q{<SOAP-ENV:Envelope
0 0.00000 0.00000 20: xmlns:SOAP-
0 0.00000 0.00000 21: <SOAP-
0 0.00000 0.00000 22: <test>Test</test>
0 0.00000 0.00000 23: <test2 >Test2</test2>
0 0.00000 0.00000 24: <test2 >Test2</test2>
0 0.00000 0.00000 25: <test2 >Test2</test2>
0 0.00000 0.00000 26: <test2 >Test2</test2>
0 0.00000 0.00000 27: <test2 >Test2</test2>
0 0.00000 0.00000 28: <test2 >Test2</test2>
0 0.00000 0.00000 29: <test2 >Test2</test2>
0 0.00000 0.00000 30: <test2 >Test2</test2>
0 0.00000 0.00000 31: <test2 >Test2</test2>
0 0.00000 0.00000 32: <test2 >Test2</test2>
0 0.00000 0.00000 33: <test2 >Test2</test2>
0 0.00000 0.00000 34: <test2 >Test2</test2>
0 0.00000 0.00000 35: <test2 >Test2</test2>
0 0.00000 0.00000 36: <test>Test</test>
0 0.00000 0.00000 37: <test>Test</test>
0 0.00000 0.00000 38: <test>Test</test>
0 0.00000 0.00000 39: <test>Test</test>
0 0.00000 0.00000 40: <test>Test</test>
0 0.00000 0.00000 41: <test>Test</test>
0 0.00000 0.00000 42: <test>Test</test>
0 0.00000 0.00000 43: <test>Test</test>
0 0.00000 0.00000 44: <test>Test</test>
0 0.00000 0.00000 45: <test>Test</test>
0 0.00000 0.00000 46: <test>Test</test>
0 0.00000 0.00000 47: </MyAtomicComplexTypeElement>
0 0.00000 0.00000 48:</SOAP-ENV:Body></SOAP-ENV:Envelope>};
0 0.00000 0.00000 49:
0 0.00000 0.00000 50:
0 0.00000 0.00000 51:my $parser =
0 0.00000 0.00000 52: class_resolver => 'FakeResolver'
0 0.00000 0.00000 53:});
0 0.00000 0.00000 54:
0 0.00000 0.00000 55:my $hash_parser =
0 0.00000 0.00000 56:
================ SmallProf version 2.02 ================
Profile of 01_expat.t Page 6
=================================================================
count wall tm cpu time line
0 0.00000 0.00000 57:$XML::Simple::PREFERRED_PARSER =
0 0.00000 0.00000 58:
0 0.00000 0.00000 59:my $libxml = XML::LibXML->new();
0 0.00000 0.00000 60:my @data;
0 0.00000 0.00000 61:timethese 1000,
0 0.00000 0.00000 62:{
0 0.00000 0.00000 63: # 'Hash (SOAP:WSDL)' => sub { push @data,
0 0.00000 0.00000 64: 'SOAP::WSDL' => sub { push @data, $parser-
0 0.00000 0.00000 65:# 'XML::Simple (Hash)' => sub { push @data,
0 0.00000 0.00000 66:# 'XML::LibXML (DOM)' => sub { push @data,
0 0.00000 0.00000 67:};
0 0.00000 0.00000 68:
0 0.00000 0.00000 69:# use Test::More tests => 1;
0 0.00000 0.00000 70:#is $parser->get_data(),
0 0.00000 0.00000 71:# . q{<test >Test</test><test2
0 0.00000 0.00000 72:# , 'Content comparison';
0 0.00000 0.00000 73:
0 0.00000 0.00000 74:#$parser->class_resolver( 'FakeResolver2' );
0 0.00000 0.00000 75:
0 0.00000 0.00000 76:
0 0.00000 0.00000 77:# data classes reside in t/lib/Typelib/
0 0.00000 0.00000 78:BEGIN {
0 0.00000 0.00000 79: package FakeResolver;
0 0.00000 0.00000 80: {
0 0.00000 0.00000 81: my %class_list = (
0 0.00000 0.00000 82: 'MyAtomicComplexTypeElement' =>
0 0.00000 0.00000 83: 'MyAtomicComplexTypeElement/test'
0 0.00000 0.00000 84:
0 0.00000 0.00000 85: );
0 0.00000 0.00000 86:
0 0.00000 0.00000 87: sub get_map { return \%class_list };
0 0.00000 0.00000 88:
0 0.00000 0.00000 89: sub new { return bless {},
0 0.00000 0.00000 90:
0 0.00000 0.00000 91: sub get_class {
0 0.00000 0.00000 92: my $name = join('/', @{ $_[1] });
0 0.00000 0.00000 93: return ($class_list{ $name }) ?
0 0.00000 0.00000 94: : warn "no class found for
0 0.00000 0.00000 95: };
0 0.00000 0.00000 96: };
0 0.00000 0.00000 97:};
1 0.00004 0.00000 1:print 1

View File

@@ -5,7 +5,7 @@ use Pod::Usage;
use Getopt::Long;
use LWP::UserAgent;
use SOAP::WSDL::Expat::WSDLParser;
use SOAP::WSDL::Generator::Template::XSD;
use SOAP::WSDL::Factory::Generator;
use Term::ReadKey;
my %opt = (
@@ -16,7 +16,8 @@ my %opt = (
typemap_prefix => 'MyTypemaps',
interface_prefix => 'MyInterfaces',
base_path => 'lib/',
proxy => undef
proxy => undef,
generator => 'XSD',
);
{ # a block just to scope "no warnings"
@@ -57,6 +58,7 @@ GetOptions(\%opt,
keep_alive
user=s
password=s
generator=s
)
);
@@ -91,20 +93,29 @@ if ($opt{typemap_include}) {
%typemap = do $opt{typemap_include};
}
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
type_prefix => $opt{ type_prefix },
typemap_prefix => $opt{ typemap_prefix },
element_prefix => $opt{ element_prefix },
interface_prefix => $opt{ interface_prefix },
OUTPUT_PATH => $opt{ base_path },
definitions => $definitions,
});
my $generator = SOAP::WSDL::Factory::Generator->get_generator({ type => $opt{'generator'} });
if (%typemap) {
if ($generator->can('set_typemap')) {
$generator->set_typemap( \%typemap );
}
else {
warn "Typemap snippet given, but generator does not support it\n";
}
};
$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_wsdl($xml) if $generator->can('set_wsdl');
# start with typelib, as errors will most likely occur here...
$generator->generate_typelib();
$generator->generate_interface();
$generator->generate_typemap({ (%typemap) ? (typemap => \%typemap) : () });
$generator->generate();
__END__
=pod
@@ -133,13 +144,15 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
base_path b Path to create classes in.
Default: .
typemap_include mi File to include in typemap. Must eval() to a valid
perl hash (not a has ref !).
perl hash (not a hash ref !).
proxy x HTTP(S) proxy to use (if any). wsdl2perl will also
use the proxy settings specified via the HTTP_PROXY
and HTTPS_PROXY environment variables.
keep_alive Use http keep_alive.
user Username for HTTP authentication
password Password. wsdl2perl will prompt if not given.
generator g Generator to use.
Default: XSD
help h Show help content
=head1 DESCRIPTION

View File

@@ -604,6 +604,11 @@ details.
=over
=item * perl 5.8.0 or higher required
SOAP::WSDL needs perl 5.8.0 or higher. This is due to a bug in perls
before - see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746 for details.
=item * Apache SOAP datatypes are not supported
You currently can't use SOAP::WSDL with Apache SOAP datatypes like map.
@@ -731,9 +736,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 308 $
$Rev: 332 $
$LastChangedBy: kutterma $
$Id: WSDL.pm 308 2007-10-05 17:35:28Z kutterma $
$Id: WSDL.pm 332 2007-10-19 07:29:03Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
=cut

View File

@@ -9,6 +9,7 @@ our $VERSION = '2.00_17';
sub call {
my ($self, $method, $body, $header) = @_;
if (not blessed $body) {
$body = {} if not defined $body;
my $class = $method->{ body }->{ parts }->[0];
eval "require $class" || die $@;
$body = $class->new($body);
@@ -116,9 +117,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 303 $
$Rev: 323 $
$LastChangedBy: kutterma $
$Id: Base.pm 303 2007-10-01 18:51:50Z kutterma $
$Id: Base.pm 323 2007-10-17 15:23:05Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
=cut

View File

@@ -1,11 +1,11 @@
package SOAP::WSDL::Deserializer::SOAP11;
package SOAP::WSDL::Deserializer::XSD;
use strict;
use warnings;
use Class::Std::Storable;
use SOAP::WSDL::SOAP::Typelib::Fault11;
use SOAP::WSDL::Expat::MessageParser;
our $VERSION='2.00_17';
our $VERSION='2.00_21';
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);

View File

@@ -89,7 +89,7 @@ SOAP::WSDL::Expat::Message2Hash - Convert SOAP messages to perl hash refs
Real fast expat based SOAP message parser.
See L<SOAP::WSDL::Parser> for details.
See L<SOAP::WSDL::Manual::Parser> for details.
=head1 Bugs and Limitations

View File

@@ -199,7 +199,7 @@ SOAP::WSDL::Expat::MessageParser - Convert SOAP messages to custom object trees
Real fast expat based SOAP message parser.
See L<SOAP::WSDL::Parser> for details.
See L<SOAP::WSDL::Manual::Parser> for details.
=head2 Skipping unwanted items
@@ -234,8 +234,8 @@ This module may be used under the same terms as perl itself.
$ID: $
$LastChangedDate: 2007-10-03 20:46:56 +0200 (Mit, 03 Okt 2007) $
$LastChangedRevision: 305 $
$LastChangedDate: 2007-10-07 19:27:58 +0200 (Son, 07 Okt 2007) $
$LastChangedRevision: 313 $
$LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $

View File

@@ -48,7 +48,7 @@ SOAP::WSDL::Expat::MessageStreamParser - Convert SOAP messages to custom object
ExpatNB based parser for parsing huge documents.
See L<SOAP::WSDL::Parser> for details.
See L<SOAP::WSDL::Manual::Parser> for details.
=head1 Bugs and Limitations
@@ -68,8 +68,8 @@ This module may be used under the same terms as perl itself.
$ID: $
$LastChangedDate: 2007-10-03 20:46:56 +0200 (Mit, 03 Okt 2007) $
$LastChangedRevision: 305 $
$LastChangedDate: 2007-10-07 19:27:58 +0200 (Son, 07 Okt 2007) $
$LastChangedRevision: 313 $
$LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $

View File

@@ -3,7 +3,7 @@ use strict;
use warnings;
my %DESERIALIZER = (
'1.1' => 'SOAP::WSDL::Deserializer::SOAP11',
'1.1' => 'SOAP::WSDL::Deserializer::XSD',
);
# class method
@@ -64,7 +64,7 @@ SOAP::WSDL::Deserializer tries to load one of the following classes:
=back
By default, L<SOAP::WSDL::Deserializer::SOAP11|SOAP::WSDL::Deserializer::SOAP11>
By default, L<SOAP::WSDL::Deserializer::XSD|SOAP::WSDL::Deserializer::XSD>
is registered for SOAP1.1 messages.
=head1 METHODS

View File

@@ -0,0 +1,172 @@
package SOAP::WSDL::Factory::Generator;
use strict;
use warnings;
our $VERSION='2.00_18';
my %GENERATOR = (
'XSD' => 'SOAP::WSDL::Generator::Template::XSD',
);
# class method
sub register {
my ($class, $ref_type, $package) = @_;
$GENERATOR{ $ref_type } = $package;
}
sub get_generator {
my ($self, $args_of_ref) = @_;
# sanity check
# die "no generator registered for generation method $args_of_ref->{ type }"
#
my $generator_class = (exists ($GENERATOR{ $args_of_ref->{ type } }))
? $GENERATOR{ $args_of_ref->{ type } }
: $args_of_ref->{ type };
# load module
eval "require $generator_class"
or die "Cannot load generator $generator_class", $@;
return $generator_class->new();
}
1;
=pod
=head1 NAME
SOAP::WSDL::Factory:Generator - Factory for retrieving generator objects
=head1 SYNOPSIS
# from SOAP::WSDL::Client:
$generator = SOAP::WSDL::Factory::Generator->get_generator({
soap_version => $soap_version,
});
# in generator class:
package MyWickedGenerator;
use SOAP::WSDL::Factory::Generator;
# register as generator for SOAP1.2 messages
SOAP::WSDL::Factory::Generator->register( '1.2' , __PACKAGE__ );
=head1 DESCRIPTION
SOAP::WSDL::Factory::Generator serves as factory for retrieving
generator objects for SOAP::WSDL.
The actual work is done by specific generator classes.
SOAP::WSDL::Generator tries to load one of the following classes:
=over
=item * the class registered for the scheme via register()
=back
=head1 METHODS
=head2 register
SOAP::WSDL::Generator->register('Lite', 'MyWickedGenerator');
Globally registers a class for use as generator class.
=head2 get_generator
Returns an object of the generator class for this endpoint.
=head1 WRITING YOUR OWN GENERATOR CLASS
=head2 Registering a generator
Generator classes may register with SOAP::WSDL::Factory::Generator.
Registering a generator class with SOAP::WSDL::Factory::Generator is done
by executing the following code where $version is the SOAP version the
class should be used for, and $class is the class name.
SOAP::WSDL::Factory::Generator->register( $version, $class);
To auto-register your transport class on loading, execute register() in
your generator class (see L<SYNOPSIS|SYNOPSIS> above).
=head2 Generator package layout
Generator modules must be named equal to the generator class they contain.
There can only be one generator class per generator module.
=head2 Methods to implement
Generator classes must implement the following methods:
=over
=item * new
Constructor.
=item * generate
Generate SOAP interface
=back
Generators may implements one or more of the following configuration
methods. All of them are tried via can() by wsdl2perl.
=over
=item * set_wsdl
Set the raw WSDL XML. Implement if you have your own WSDL parser.
=item * set_definitions
Sets the (parsed) SOAP::WSDL::Definitions object.
=item * set_type_prefix
Sets the prefix for XML Schema type classes
=item * set_element_prefix
Sets the prefix for XML Schema element classes
=item * set_typemap_prefix
Sets the prefix for typemap classes (class resolvers).
=item * set_interface_prefix
Sets the prefix for interface classes
=item * set_typemap
Set user-defined typemap snippet
=back
=head1 LICENSE
Copyright (c) 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under the same
terms as perl itself
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 302 $
$LastChangedBy: kutterma $
$Id: Generator.pm 302 2007-09-30 19:25:25Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Generator.pm $
=cut

View File

@@ -5,7 +5,7 @@ use warnings;
our $VERSION='2.00_17';
my %SERIALIZER = (
'1.1' => 'SOAP::WSDL::Serializer::SOAP11',
'1.1' => 'SOAP::WSDL::Serializer::XSD',
);
# class method
@@ -95,7 +95,7 @@ class should be used for, and $class is the class name.
SOAP::WSDL::Factory::Serializer->register( $version, $class);
To auto-register your transport class on loading, execute register() in
your tranport class (see L<SYNOPSIS|SYNOPSIS> above).
your tranport class (see L</SYNOPSIS> above).
=head2 Serializer package layout
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 302 $
$Rev: 329 $
$LastChangedBy: kutterma $
$Id: Serializer.pm 302 2007-09-30 19:25:25Z kutterma $
$Id: Serializer.pm 329 2007-10-18 19:42:09Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
=cut

View File

@@ -18,18 +18,18 @@ my %OUTPUT_PATH_of :ATTR(:name<OUTPUT_PATH> :default<.>);
sub START {
my ($self, $ident, $arg_ref) = @_;
$tt_of{$ident} = Template->new(
}
sub _process :PROTECTED {
my ($self, $template, $arg_ref, $output) = @_;
my $ident = ident $self;
my $tt = $tt_of{$ident} ||= Template->new(
DEBUG => 1,
EVAL_PERL => $EVAL_PERL_of{ $ident },
RECURSION => $RECURSION_of{ $ident },
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
);
}
sub _process :PROTECTED {
my ($self, $template, $arg_ref, $output) = @_;
my $tt = $self->get_tt();
$tt->process( $template,
{
definitions => $self->get_definitions,
@@ -42,7 +42,7 @@ sub _process :PROTECTED {
%{ $arg_ref }
},
$output)
or die $tt->error();
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error();
}

View File

@@ -9,7 +9,8 @@ use SOAP::WSDL::Generator::Visitor::Typemap;
use SOAP::WSDL::Generator::Visitor::Typelib;
use base qw(SOAP::WSDL::Generator::Template);
my %output_of :ATTR(:name<output> :default<()>);
my %output_of :ATTR(:name<output> :default<()>);
my %typemap_of :ATTR(:name<typemap> :default<({})>);
sub BUILD {
my ($self, $ident, $arg_ref) = @_;
@@ -17,10 +18,40 @@ sub BUILD {
$self->set_RECURSION(1);
$self->set_INCLUDE_PATH( exists $arg_ref->{INCLUDE_PATH}
? $arg_ref->{INCLUDE_PATH}
: File::Spec->rel2abs( dirname __FILE__ ). '/XSD/'
: do {
# ignore uninitialized warnings - File::Spec warns about
# uninitialized values, probably because we have no filename
local $SIG{__WARN__} = sub {
return if ($_[0]=~m{\buninitialized\b});
CORE::warn @_;
};
# makeup path for the OS we're running on
my ($volume, $dir, $file) = File::Spec->splitpath(
File::Spec->rel2abs( dirname __FILE__ )
);
$dir = File::Spec->catdir($dir, $file, 'XSD');
# return path put together...
my $path = File::Spec->catpath( $volume, $dir );
# Fixup path for windows - / works fine, \ does
# not...
if ( eval { &Win32::BuildNumber } ) {
$path =~s{\\}{/}g;
}
$path;
}
);
}
sub generate {
my $self = shift;
my $opt = shift;
$self->generate_typelib( $opt );
$self->generate_interface( $opt );
$self->generate_typemap( $opt );
}
sub generate_typelib {
my ($self) = @_;
@@ -46,17 +77,24 @@ sub generate_interface {
next if not $port->first_address;
next if not $port->first_address->isa('SOAP::WSDL::SOAP::Address');
my $port_name = $port->get_name;
$port_name =~s{ \A .+\. }{}xms;
my $output = $arg_ref->{ output }
? $arg_ref->{ output }
: $self->_generate_filename( $self->get_interface_prefix(), $service->get_name(), $port->get_name );
: $self->_generate_filename(
$self->get_interface_prefix(),
$service->get_name(),
$port_name,
);
print "Creating interface class $output\n";
$self->_process('Interface.tt',
{
service => $service,
port => $port,
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
},
$output);
},
$output, binmode => ':utf8');
}
}
}
@@ -73,7 +111,8 @@ sub generate_typemap {
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
%{ $typemap_of{ident $self }},
}
});
for my $service (@{ $self->get_definitions->get_service }) {
@@ -81,6 +120,8 @@ sub generate_typemap {
my $output = $arg_ref->{ output }
? $arg_ref->{ output }
: $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() );
print "Creating typemap class $output\n";
$self->_process('Typemap.tt',
{
service => $service,

View File

@@ -1,12 +1,16 @@
package [% interface_prefix %]::[% service.get_name %]::[% port.get_name %];
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
use strict;
use warnings;
use Class::Std::Storable;
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class');
sub START {
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name %]')
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]')
if not $_[2]->{class_resolver};
}

View File

@@ -1,3 +1,4 @@
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
{ # BLOCK to scope variables

View File

@@ -1,7 +1,7 @@
[% IF (complexType.get_variety == 'restriction');
INCLUDE complexType/restriction.tt(complexType = complexType);
ELSIF (complexType.get_variety == 'sequence');
THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet";
INCLUDE complexType/extension.tt(complexType = complexType);
ELSE;
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
END;

View File

@@ -1,15 +1,7 @@
[% IF (complexType.get_variety == 'all');
INCLUDE complexType/all.tt(complexType = complexType);
ELSIF (complexType.get_variety == 'sequence');
INCLUDE complexType/all.tt(complexType = complexType);
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_contentModel == 'simpleContent');
[% IF (complexType.get_contentModel == 'simpleContent');
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet";
ELSIF (complexType.get_contentModel == 'complexContent');
INCLUDE complexType/complexContent.tt(complexType = complexType);
ELSE;
THROW NOT_IMPLEMENTED, "Unknown content model ${ complexType.get_contentModel }";
INCLUDE complexType/variety.tt(complexType = complexType);
END %]

View File

@@ -0,0 +1,24 @@
[%
base_name=complexType.expand( complexType.get_base);
base_type = definitions.first_types.find_type( base_name );
element_from = complexType.get_element;
#
# Sanity check: All original elements must be noted first
#
FOREACH element = base_type.get_element;
IF element_from.${ loop.index }.get_name != element.get_name;
THROW WSDL "${element.get_name} not found at position ${ loop.index } in extension type ${ complexType.get_name }";
END;
END;
-%]
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]);
[%
INCLUDE complexType/variety.tt(complexType = complexType);
%]

View File

@@ -1,7 +1,7 @@
[% IF (base=complexType.get_base);
base_name=complexType.expand(base);
-%]
use base qw([% type_prefix %]::[% base_name.1 %]);
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]);
[%
ELSE;
THROW NOT_IMPLEMENTED, "restriction without base not supported";

View File

@@ -0,0 +1,15 @@
[%
IF (complexType.get_variety == 'all');
INCLUDE complexType/all.tt(complexType = complexType);
ELSIF (complexType.get_variety == 'sequence');
INCLUDE complexType/all.tt(complexType = complexType);
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 })";
ELSE;
# There's no variety - might be empty complexType
END;
%]

View File

@@ -227,7 +227,7 @@ L<SOAP::WSDL::XSD::Typelib::ComplexType>, L<SOAP::WSDL::XSD::Typelib::SimpleType
L<SOAP::WSDL::XSD::Typelib::Element> tell you how to create subclasses of XML schema
types.
L<SOAP::WSDL::Parser> will tell you how to create a typemap class.
L<SOAP::WSDL::Manual::Parser> will tell you how to create a typemap class.
=back
@@ -273,7 +273,7 @@ class. This unfortunately means that you have to set the endpoint URL, too:
You may, of course, decide to just hack the generated class. Be advised that
subclassing might be a more appropriate solution - re-generating overwrites
your changes.
changes in interface classes.
=head3 Accessing HTTPS webservices protected by certificate authentication

View File

@@ -2,7 +2,7 @@
=head1 NAME
SOAP::WSDL::Parser - How SOAP::WSDL parses XML messages
SOAP::WSDL::Manual::Parser - How SOAP::WSDL parses XML messages
=head1 Which XML message does SOAP::WSDL parse ?

View File

@@ -2,7 +2,7 @@
=head1 NAME
SOAP::WSDL::XSD - SOAP::WSDL's XML Schema implementation
SOAP::WSDL::Manual::XSD - SOAP::WSDL's XML Schema implementation
=head1 DESCRIPTION
@@ -15,6 +15,32 @@ class (usually in it's own file).
Atomic types are either directly included in the class of their parent's
node, or as sub-package in their parent class' file.
While the implementation is still incomplete, it covers the XML schema
definitions used by most object mappers.
=head1 USAGE
You can use SOAP::WSDL::XSD based classes just like any perl class - you may
instantiate it, inherit from it etc.
You should be aware, that SOAP::WSDL::XSD based classes are inside-out
classes using Class::Std, though - things you would expect from hash-based
classes like using the blessed hash ref as data storage won't work.
Moreover, most classes override Class::Std's default constructor for speed -
you should not expect BUILD or START methods to work, unless you call them
yourself (or define a new constructor).
All SOAP::WSDL::XSD based complexType classes allow a hash ref mathing their
data structure as only parameter to new(). You may mix hash and list refs and
objects in the structure passed to new - as long as the structure matches, it
will work fine.
All SOAP::WSDL::XSD based simpleType (and builtin) classes accept a single
hash ref with the only key "value" and the value to be set as value.
=head1 HOW IT WORKS
=head2 Base classes
SOAP::WSDL::XSD provides a set of base classes for the construction of XML
@@ -43,7 +69,14 @@ L</TRANSLATION RULES> for details.
=head3 complexType construction class
For the construction of complexType classes, the
For the construction of complexType classes, the construction class
SOAP::WSDL::XSD::Typelib::ComplexType is provided. It provides a __factory
method for placing attributes in generated classes, and generating
appropriate setter/getter accessors.
The setters are special: They handle complex data structures of any type
(meaning hash refs, list refs and objects, and any combination of them), as
long as their structure matches the expected structure.
=head1 TRANSLATION RULES
@@ -81,9 +114,9 @@ SOAP::WSDL::XSD::Typelib::Element and from the base type of the atomic type.
Element atomic Type
base class base class
^ ^
| |
-------------
^ ^
| |
--------------
|
element simpleType class
@@ -95,9 +128,9 @@ SOAP::WSDL::XSD::Typelib::ComplexType.
Element complexType
base class base class
^ ^
| |
-------------
^ ^
| |
--------------
|
element complexType class
@@ -108,14 +141,36 @@ TODO add more elaborate description
Some content models are not implemented yet. The content models
implemented are described below.
=head3 complexType with "sequence" variety
=head3 complexType with "all" variety
Complex types with "all" variety inherit from
SOAP::WSDL::XSD::Typelib::ComplexType, and call it's factory method for
creating fields and accessors/mutators for the complexType's elements.
All element's type classes are loaded. Complex type classes have a "has a"
relationship to their element fields.
Element fields may either be element classes (for element ref="") or type
classes (for element type=""). No extra element classes are created for
a complexType's elements.
complexType
base class
^
|
complexType all
---------------- has a
element name="a" ------------> Element or type class object
element name="b" ------------> Element or type class object
The implementation for all does enforce the order of elements as described
in the WSDL, even though this is not required by the XML Schema
specification.
=head3 complexType with "sequence" variety
The implementation of the "sequence" variety is the same as for all.
=head3 complexType with "choice" variety
The implementation for choice currently is the same as for all - which means,
@@ -123,6 +178,13 @@ no check for occurence are made.
=head3 complexType with complexContent content model
Note that complexType classes with complexContent content model don't exhibit
their type via the xsi:type attribute yet, so they currently cannot be used
as a replacement for their base type.
SOAP::WSDL's XSD deserializer backend does not recognize the xsi:type=""
attribute either yet.
=over
=item * restriction variety
@@ -130,12 +192,37 @@ no check for occurence are made.
ComplexType classes with restriction variety inherit from their base type.
No additional processing or content checking is performed yet.
Note that complexType with restriction variety classes don't exhibit their
type via the xsi:type attribute yet, so they currently cannot be used as
a replacement for their base type.
complexType
base type class
^
|
complexType
restriction
=item * extension variety
ComplexType classes with extension variety inherit from the XSD base
complexType class and from their base type.
Extension classes are checked for (re-)defining all elements of their parent
class.
Note that a derived type's elements (=properties) overrides the getter /
setter methods for all inherited elements. All object data is stored in the
derived type's class, not in the defining class (See L<Class::Std> for a
discussion on inside out object data storage).
No additional processing or content checking is performed yet.
complexType complexType
base class base type class
^ ^
| |
-----------------
|
complexType
extension
=back
=head2 SimpleType
@@ -155,8 +242,6 @@ SOAP::WSDL::XSD::Typelib::XSD::list.
Derivation by restriction is implemented by inheriting from a base type and
applying the required restrictions.
=head2 Complex Types
=head1 FACETS
XML Schema facets are not implemented yet.
@@ -182,7 +267,6 @@ The following XML Schema declaration elements are not supported yet:
=item * Type definition elements
complexContent - only restriction supported
simpleContent
union

View File

@@ -1,11 +1,10 @@
#!/usr/bin/perl -w
# TODO rename to ::XSD
package SOAP::WSDL::Serializer::SOAP11;
package SOAP::WSDL::Serializer::XSD;
use strict;
use warnings;
use Class::Std::Storable;
our $VERSION='2.00_13';
our $VERSION='2.00_21';
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';

View File

@@ -136,6 +136,10 @@ my %TYPES = (
type => 'METHOD',
method => 'set_restriction',
},
extension => {
type => 'METHOD',
method => 'set_extension',
},
list => {
type => 'METHOD',
method => 'set_list',

View File

@@ -18,7 +18,7 @@ my %abstract_of :ATTR(:name<abstract> :default<()>);
my %mixed_of :ATTR(:name<mixed> :default<()>); # default is false
# is set to simpleContent/complexContent
my %content_model_of :ATTR(:name<contentModel> :default<()>);
my %content_model_of :ATTR(:name<contentModel> :default<NONE>);
sub get_variety; *get_variety = \&get_flavor;
@@ -45,6 +45,12 @@ sub set_restriction {
$base_of{ ident $self } = $element->{ Value };
}
sub set_extension {
my $self = shift;
my $element = shift;
$flavor_of{ ident $self } = 'extension';
$base_of{ ident $self } = $element->{ Value };
}
sub init {
my $self = shift;

View File

@@ -4,7 +4,7 @@ use warnings;
use Class::Std::Storable;
use base qw(SOAP::WSDL::Base);
our $VERSION='2.00_17';
our $VERSION='2.00_22';
my %annotation_of :ATTR(:name<annotation> :default<()>);
my %simpleType_of :ATTR(:name<simpleType> :default<()>);

View File

@@ -3,9 +3,6 @@ use strict;
use warnings;
use Class::Std::Storable;
# my %xmlns_of :ATTR(:get<xmlns> :init_arg<xmlns> :default<()>);
# sub set_xmlns { $xmlns_of{ ident $_[0] } = $_[1] };
sub get_xmlns { 'http://www.w3.org/2001/XMLSchema' };
# use $_[1] for performance

View File

@@ -41,6 +41,7 @@ BEGIN {
sub set_value {
# use set_value from base class if we have a XML-DateTime format
#2037-12-31T00:00:00.0000000+01:00
return if not $_[1];
return $_[0]->SUPER::set_value($_[1]) if (
$_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2}
T \d{2} \: \d{2} \: \d{2} (:? \. \d{1,7} )?
@@ -50,7 +51,8 @@ sub set_value {
# strptime sets empty values to undef - and strftime doesn't like that...
my @time_from = map { ! defined $_ ? 0 : $_ } strptime($_[1]);
undef $time_from[-1];
return if not (@time_from);
undef $time_from[$#time_from];
my $time_str = strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from );
substr $time_str, -2, 0, ':';

View File

@@ -35,8 +35,8 @@ sub serialize {
my ($self, $opt) = @_;
my $ident = ident $self;
$opt ||= {};
my $value = $self->get_value();
return $self->start_tag({ %$opt, nil => 1})
my $value = $self->get_value();;
return $self->start_tag({ %{ $opt }, nil => 1})
if not defined $value;
# HTML::Entities does the same - and more, thus it's around 1/3 slower...

View File

@@ -4,6 +4,8 @@ use warnings;
use Date::Parse;
use Date::Format;
our $VERSION='2.00_18';
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
@@ -40,8 +42,16 @@ sub set_value {
# We leave out the optional nanoseconds part, as it would always be empty.
else {
# strptime sets empty values to undef - and strftime doesn't like that...
# we even need to set it to 1 to prevent a "Day '0' out of range 1..31" warning...
my @time_from = map { ! defined $_ ? 1 : $_ } strptime($_[1]);
# we even need to set it to 1 to prevent a "Day '0' out of range 1..31" warning..
# we need to set the current date for correct TZ conversion -
# could be daylight savings time
my @now = localtime;
my @time_from = map { my $alternative = shift @now;
! defined $_
? $alternative
: $_ } strptime($_[1]);
undef $time_from[-1];
my $time_str = strftime( '%H:%M:%S%z', @time_from );
substr $time_str, -2, 0, ':';
$_[0]->SUPER::set_value($time_str);

View File

@@ -9,7 +9,7 @@ use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
our $VERSION = '2.00_16';
our $VERSION = '2.00_23';
my %ELEMENTS_FROM;
my %ATTRIBUTES_OF;
@@ -19,10 +19,11 @@ my %CLASSES_OF;
# We could also handle them via AUTOMETHOD,
# but AUTOMETHOD should always croak...
# Do we really need this ?
#sub STORABLE_freeze_pre {}
#sub STORABLE_freeze_post {}
#sub STORABLE_thaw_pre {}
#sub STORABLE_thaw_post {}
# ... looks like we do...
sub STORABLE_freeze_pre {}
sub STORABLE_freeze_post {}
sub STORABLE_thaw_pre {}
sub STORABLE_thaw_post {}
# for error reporting. Eases working with data objects...
sub AUTOMETHOD {
@@ -97,11 +98,11 @@ sub _factory {
*{ "$class\::set_$name" } = sub {
my $is_ref = ref $_[1];
$attribute_ref->{ ident $_[0] } = ($is_ref)
? $is_ref eq 'ARRAY'
? ($is_ref eq 'ARRAY')
? $is_list # remembered from outside closure
? $type->new({ value => $_[1] }) # list element - can take list ref as value
: [ map {
ref $_
? $type->new({ value => $_[1] }) # it's a list element - can take list ref as value
: [ map { # it's not a list element - set value to list of objects
ref $_
? ref $_ eq 'HASH'
? $type->new($_)
: ref $_ eq $type
@@ -112,10 +113,15 @@ sub _factory {
]
: $is_ref eq 'HASH'
? $type->new( $_[1] )
: $is_ref eq $type
? $_[1]
# neither ARRAY nor HASH - probably an object...
: ($is_ref eq $type) # of required type ? ->isa would be a better test...
? $_[1] # use it
: die croak "cannot use $is_ref reference as value for $name - $type required"
: $type->new({ value => $_[1] });
# not $is_ref
: $type->new({ value => $_[1] });
return;
};
*{ "$class\::add_$name" } = sub {
@@ -124,17 +130,25 @@ sub _factory {
if not defined $_[1];
# first call
return $attribute_ref->{ $ident } = $_[1]
if not defined $attribute_ref->{ $ident };
# second call: listify previous value if it's no list
$attribute_ref->{ $ident } = [ $attribute_ref->{ $ident } ]
if not ref $attribute_ref->{ $ident } eq 'ARRAY';
# test for existance, not for definedness
if (not exists $attribute_ref->{ $ident }) {
$attribute_ref->{ $ident } = $_[1];
return;
}
if (not ref $attribute_ref->{ $ident } eq 'ARRAY') {
# second call: listify previous value if it's no list and add current
$attribute_ref->{ $ident } = [ $attribute_ref->{ $ident }, $_[1] ];
return;
}
# second and following: add to list
return push @{ $attribute_ref->{ $ident } }, $_[1];
push @{ $attribute_ref->{ $ident } }, $_[1];
return;
};
# TODO: remove this alias - we don't use it, and it's pretty much
# misleading...
*{ "$class\::$name" } = *{ "$class\::add_$name" };
}
@@ -174,7 +188,6 @@ sub _factory {
# But what about choice, extension ?
*{ "$class\::_serialize" } = sub {
my $ident = ident $_[0];
# my $class = ref $_[0];
# return concatenated return value of serialize call of all
# elements retrieved from get_elements expanding list refs.
# get_elements is inlined for performance.
@@ -209,14 +222,13 @@ sub _factory {
};
*{ "$class\::serialize" } = sub {
my ($self, $opt) = @_;
$opt ||= {};
$_[1] ||= {}; # maybe even replace by assigning a constant var
# do we have a empty element ?
return $self->start_tag({ %$opt, empty => 1 })
return $_[0]->start_tag({ %{ $_[1] }, empty => 1 })
if not defined $ELEMENTS_FROM{ $class } or not @{ $ELEMENTS_FROM{ $class } };
return join q{}, $self->start_tag($opt),
$self->_serialize(), $self->end_tag();
return join q{}, $_[0]->start_tag($_[1]),
$_[0]->_serialize(), $_[0]->end_tag();
}
}
@@ -376,9 +388,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 309 $
$Rev: 346 $
$LastChangedBy: kutterma $
$Id: ComplexType.pm 309 2007-10-05 17:48:37Z kutterma $
$Id: ComplexType.pm 346 2007-11-05 21:38:56Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $
=cut

View File

@@ -2,12 +2,16 @@
package SOAP::WSDL::XSD::Typelib::Element;
use strict;
our $VERSION = '2.00_23';
my %NAME;
my %NILLABLE;
my %REF;
my %MIN_OCCURS;
my %MAX_OCCURS;
# TODO replace by generated methods?
#
# Class data - remember, we're the base class for a class factory or for
# generated code...
# use BLOCK: for scoping
@@ -41,13 +45,16 @@ sub start_tag {
my @attr_from = ();
if ($_[1]->{ nil }) {
return q{} if not $NILLABLE{ ref $_[1] };
return q{} if not $NILLABLE{ ref $_[0] };
push @attr_from, 'xsi:nil="true"';
$ending = '/>';
}
if ($_[1]->{qualified}) {
push @attr_from, 'xmlns="' . $_[0]->get_xmlns . '"';
}
# do we need to check for name ? Element ref="" should have it's own
# start_tag. If we don't need to check, we can speed things up
return join q{ }, "<$_[1]->{ name }" , @attr_from , $ending if $_[1]->{ name };
return join q{ }, "<$NAME{ ref $_[0]}" , @attr_from , $ending;
}
@@ -61,6 +68,9 @@ sub start_tag {
# return "</$opt->{name}>" if $opt->{name};
# return "</"$NAME{$class}>";
#
# do we need to check for name ? Element ref="" should have it's own
# end_tag. If we don't need to check, we can speed things up by defining
# end tag with () prototype - perl will inline it for us if we do...
sub end_tag {
return "</$_[1]->{name}>" if $_[1]->{name};
return "</$NAME{ ref $_[0] }>";

View File

@@ -7,8 +7,8 @@ use lib '../lib';
my @modules = qw(
SOAP::WSDL
SOAP::WSDL::Client
SOAP::WSDL::Serializer::SOAP11
SOAP::WSDL::Deserializer::SOAP11
SOAP::WSDL::Serializer::XSD
SOAP::WSDL::Deserializer::XSD
SOAP::WSDL::Transport::HTTP
SOAP::WSDL::Definitions
SOAP::WSDL::Message

View File

@@ -21,7 +21,6 @@ my $soap = SOAP::WSDL->new(
wsdl => 'file:///' . $path .'/t/acceptance/wsdl/006_sax_client.wsdl',
outputxml => 1, # required, if not set ::SOM serializer will be loaded on
# call
readable => 1,
)->wsdlinit();
$soap->servicename('MessageGateway');

View File

@@ -10,7 +10,7 @@ eval {
import Test::XML;
};
use_ok qw/SOAP::WSDL::Serializer::SOAP11/;
use_ok qw/SOAP::WSDL::Serializer::XSD/;
my $opt = {
readable => 1,
@@ -18,7 +18,7 @@ my $opt = {
},
};
my $xml;
ok( $xml = SOAP::WSDL::Serializer::SOAP11->serialize(
ok( $xml = SOAP::WSDL::Serializer::XSD->serialize(
undef, undef, $opt
),
"serialize empty envelope"

View File

@@ -1,7 +1,7 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use Test::More tests => 6;
use Test::More tests => 5;
use lib 't/lib';
use lib '../lib';
use lib 'lib';
@@ -39,14 +39,12 @@ else
# TODO factor out into different test
my $soap = SOAP::WSDL->new(
readable => 1,
wsdl => 'file:///' . $path .'/t/acceptance/wsdl/006_sax_client.wsdl',
)->wsdlinit();
$soap->servicename('MessageGateway');
ok( $soap->no_dispatch( 1 ) , "Set no_dispatch" );
ok( $soap->readable( 0 ) , "Set readable");
sub xml {
q{<SOAP-ENV:Envelope

View File

@@ -14,6 +14,12 @@ if ($@)
}
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
# print $url;
use_ok(qw/SOAP::WSDL/);
@@ -24,8 +30,7 @@ my $soap;
#2
ok( $soap = SOAP::WSDL->new(
wsdl => 'file://' . $path . '/../../acceptance/wsdl/03_complexType-all.wsdl',
readable =>1,
wsdl => 'file://' . $url . '/../../acceptance/wsdl/03_complexType-all.wsdl',
), 'Instantiated object' );
#3

View File

@@ -7,6 +7,6 @@ my $soap = SOAP::WSDL->new();
TODO: {
local $TODO="implement <choice> support";
local $TODO="implement tests";
fail "serialize choice element";
}

View File

@@ -17,6 +17,6 @@ my $soap = SOAP::WSDL->new();
TODO: {
local $TODO="implement <complexContent> support";
local $TODO="implement <complexContent> tests";
fail "serialize complexContent element";
}

View File

@@ -12,15 +12,17 @@ use_ok(qw/SOAP::WSDL/);
print "# SOAP::WSDL Version: $SOAP::WSDL::VERSION\n";
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
my $xml;
my $soap;
#2
ok( $soap = SOAP::WSDL->new(
wsdl => 'file://' . $path . '/../../acceptance/wsdl/03_complexType-element-ref.wsdl',
readable => 1,
wsdl => 'file://' . $url . '/../../acceptance/wsdl/03_complexType-element-ref.wsdl',
no_dispatch => 1,
), 'Instantiated object' );

View File

@@ -19,10 +19,14 @@ use_ok(qw/SOAP::WSDL/);
my $xml;
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
#2
ok( $soap = SOAP::WSDL->new(
wsdl => 'file://' . $path . '/../../acceptance/wsdl/03_complexType-sequence.wsdl'
wsdl => 'file://' . $url . '/../../acceptance/wsdl/03_complexType-sequence.wsdl'
), 'Instantiated object' );
#3

View File

@@ -14,14 +14,10 @@ my $soap = undef;
my $path = File::Spec->rel2abs( dirname __FILE__ );
#2
ok( $soap = SOAP::WSDL->new(
wsdl => 'file:///' . $path . '/../../acceptance/wsdl/04_element-simpleType.wsdl'
), 'Instantiated object' );
#3
$soap->readable(1);
# won't work without - would require SOAP::WSDL::Deserializer::SOM,
# which requires SOAP::Lite
$soap->outputxml(1);

View File

@@ -17,10 +17,14 @@ use_ok(qw/SOAP::WSDL/);
my $soap;
my $xml;
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
#2
ok( $soap = SOAP::WSDL->new(
wsdl => 'file://' . $path . '/../../acceptance/wsdl/04_element.wsdl'
wsdl => 'file://' . $url . '/../../acceptance/wsdl/04_element.wsdl'
), 'Instantiated object' );
#3

View File

@@ -17,7 +17,6 @@ ok( $soap = SOAP::WSDL->new(
wsdl => 'file:///' . $path . '/../../acceptance/wsdl/05_simpleType-list.wsdl'
), 'Instantiated object' );
$soap->readable(1);
# won't work without - would require SOAP::WSDL::Deserializer::SOM,
# which requires SOAP::Lite
$soap->outputxml(1);

View File

@@ -20,7 +20,6 @@ ok( $soap = SOAP::WSDL->new(
), 'Instantiated object' );
#3
$soap->readable(1);
ok( $soap->wsdlinit(
servicename => 'testService',
), 'parsed WSDL' );

View File

@@ -16,7 +16,6 @@ ok $soap = SOAP::WSDL->new(
), 'Instantiated object';
#3
$soap->readable(1);
ok $soap->wsdlinit(), 'parsed WSDL';
$soap->no_dispatch(1);
# won't work without - would require SOAP::WSDL::Deserializer::SOM,

View File

@@ -1,9 +1,12 @@
use Test::More;
eval { require SOAP::Lite } or do {
use SOAP::Lite;
eval { require SOAP::Lite; 1; } or do {
plan skip_all => 'SOAP::Lite not available';
exit 0;
};
print "# Using SOAP::Lite $SOAP::Lite::VERSION\n";
use lib '../../../lib';
plan tests => 10;
use_ok qw(SOAP::WSDL::Deserializer::SOM);
@@ -14,8 +17,12 @@ ok my $som = $deserializer->deserialize(q{<a><b>1</b><b>2</b><c>3</c></a>});
my $data = $som->match('/a')->valueof;
is $data->{ c } , 3;
is $data->{ b }->[0] , 1;
is $data->{ b }->[1] , 2;
SKIP: {
skip "SOAP::Lite > 0.69 required" , 2 if ($SOAP::Lite::VERSION < 0.69);
is $data->{ b }->[0] , 1, "array values - SOAP::Lite $SOAP::Lite::VERSION";;
is $data->{ b }->[1] , 2, "array values - SOAP::Lite $SOAP::Lite::VERSION";;
}
eval { $deserializer->generate_fault({
role => 'soap:Server',

View File

@@ -2,12 +2,12 @@ use strict;
use warnings;
use Test::More tests => 5;
use SOAP::WSDL::Deserializer::SOAP11;
use SOAP::WSDL::Deserializer::XSD;
my $obj;
ok $obj = SOAP::WSDL::Deserializer::SOAP11->new();
ok $obj = SOAP::WSDL::Deserializer::SOAP11->new({
ok $obj = SOAP::WSDL::Deserializer::XSD->new();
ok $obj = SOAP::WSDL::Deserializer::XSD->new({
class_resolver => 'TestResolver',
some_other_option => 'ignored',
});

View File

@@ -19,14 +19,8 @@ my $generator = SOAP::WSDL::Generator::Template::XSD->new({
definitions => $definitions,
});
my $output = q{};
$generator->generate_interface({
NO_POD => 1,
output => \$output,
});
ok eval $output;
$output = q{};
$generator->generate_typemap({
NO_POD => 1,
output => \$output,
@@ -35,7 +29,19 @@ $generator->generate_typemap({
ok eval $output;
print $@ if $@;
print $output;
#print $output;
$output = q{};
$generator->generate_interface({
NO_POD => 1,
output => \$output,
});
ok eval $output;
print $@ if $@;
# print $output;
__END__
my $tt = Template->new(

View File

@@ -0,0 +1,25 @@
use strict;
use warnings;
use Test::More;
use File::Spec;
use File::Basename;
eval { require XML::Compile::WSDL11 }
or plan skip_all => 'Cannot test without XML::Compile::WSDL11';
eval { require XML::LibXML }
or plan skip_all => 'Cannot test without XML::LibXML';
plan skip_all => 'XML::Compile::WSDL11 is not functional yet';
plan tests => qw(no_plan);
my $path = File::Spec->rel2abs( dirname __FILE__ );
my $libxml = XML::LibXML->new();
my $xml = $libxml->parse_file("$path/../../../acceptance/wsdl/generator_test.wsdl");
my $wsdl = XML::Compile::WSDL11->new($xml);
my $schemas = $wsdl->schemas;
my $operation = $wsdl->operation('testHeader');
my $client = $operation->prepareClient();

View File

@@ -1,4 +1,4 @@
use Test::More tests => 26;
use Test::More tests => 34;
use File::Basename qw(dirname);
use File::Spec;
use File::Path;
@@ -107,5 +107,26 @@ $complexRestriction = MyTypes::testComplexTypeRestriction->new({
is $complexRestriction->get_Test1(), 'test1';
is $complexRestriction->get_Test2(), 'test2';
ok eval { require MyTypes::testComplexTypeExtension };
$complexExtension = MyTypes::testComplexTypeExtension->new({
Test1 => 'test1',
Test2 => 'test2',
Test3 => 'test3',
});
is $complexExtension->get_Test1(), 'test1';
is $complexExtension->get_Test2(), 'test2';
is $complexExtension->get_Test3(), 'test3';
ok eval { require MyTypes::testComplexTypeElementAtomicSimpleType; };
my $ct_east = MyTypes::testComplexTypeElementAtomicSimpleType->new({
testString => 'Just some test',
testAtomicSimpleTypeElement => 42,
});
is $ct_east->get_testAtomicSimpleTypeElement, 42;
is $ct_east->get_testAtomicSimpleTypeElement->get_value(), 42;
isa_ok($ct_east->get_testAtomicSimpleTypeElement,
'MyTypes::testComplexTypeElementAtomicSimpleType::_testAtomicSimpleTypeElement');
rmtree "$path/testlib";

View File

@@ -2,6 +2,17 @@ use Test::More tests => 3;
use strict;
use warnings;
use lib '../lib';
use Date::Parse;
use Date::Format;
sub timezone {
my @time = localtime;
my $tz = strftime('%z', @time);
substr $tz, -2, 0, ':';
return $tz;
}
my $timezone = timezone;
use_ok('SOAP::WSDL::XSD::Typelib::Builtin::time');
my $obj;
@@ -9,7 +20,7 @@ my $obj;
$obj = SOAP::WSDL::XSD::Typelib::Builtin::time->new();
$obj->set_value( '12:23:03' );
is $obj->get_value() , '12:23:03+01:00', 'conversion';
is $obj->get_value() , "12:23:03$timezone", 'conversion';
$obj->set_value( '12:23:03.12345+01:00' ), ;
is $obj->get_value() , '12:23:03.12345+01:00', 'no conversion';

View File

@@ -5,6 +5,7 @@
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
>
<types>
<xsd:schema targetNamespace="urn:Test">
@@ -83,6 +84,21 @@
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="testComplexTypeExtension">
<xsd:annotation>
<xsd:documentation>complexType extension test</xsd:documentation>
</xsd:annotation>
<xsd:complexContent>
<xsd:extension base="tns:testComplexTypeAll">
<xsd:sequence>
<xsd:element name="Test1" type="xsd:string" />
<xsd:element name="Test2" type="xsd:string" minOccurs="1"/>
<xsd:element name="Test3" type="xsd:string" minOccurs="1"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="testComplexTypeChoice">
<xsd:annotation>
<xsd:documentation>
@@ -154,6 +170,22 @@
<xsd:element name="Header" type="tns:testComplexTypeSequence"/>
<xsd:element name="testHeader" type="tns:testComplexTypeSequence"/>
<xsd:element name="testChoice" type="tns:testComplexTypeChoice"/>
<xsd:complexType name="testComplexTypeElementAtomicSimpleType">
<xsd:sequence>
<xsd:element name="testString" type="xsd:string" minOccurs="0"/>
<xsd:element name="testAtomicSimpleTypeElement" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:minInclusive value="0"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>
<message name="testChoice">
@@ -197,9 +229,9 @@
</portType>
<binding type="tns:testPort" name="testBinding">
<operation name="testChoice">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<soap:operation soapAction="testChoice"/>
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="testChoice">
<soap:operation soapAction="testChoice" style="document"/>
<input>
<soap:body use="literal"/>
</input>
@@ -209,8 +241,7 @@
</operation>
<operation name="test">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<soap:operation soapAction="test"/>
<soap:operation soapAction="test" style="document"/>
<input>
<soap:body use="literal"/>
</input>
@@ -218,10 +249,8 @@
<soap:body use="literal"/>
</output>
</operation>
<operation name="testHeader">
<soap:operation soapAction="testHeader"/>
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<input>
<soap:body use="literal" parts="tns:testBody"/>
<soap:header use="literal" part="tns:testHeader" message="tns:testHeaderRequest"/>