Compare commits

...

4 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
45 changed files with 492 additions and 487 deletions

View File

@@ -4,11 +4,15 @@ $build = Module::Build->new(
create_makefile_pl => 'passthrough',
dist_abstract => 'SOAP with WSDL support',
dist_name => 'SOAP-WSDL',
dist_version => '2.00_18',
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,
'Date::Parse' => 0,
@@ -40,6 +44,11 @@ $build = Module::Build->new(
'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;

82
CHANGES
View File

@@ -1,4 +1,4 @@
Release notes for SOAP::WSDL 2.00_18
Release notes for SOAP::WSDL 2.00_23
-------
I'm proud to present a new pre-release version of SOAP::WSDL.
@@ -33,6 +33,84 @@ 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
@@ -137,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
@@ -59,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
@@ -100,7 +102,7 @@ lib/SOAP/WSDL/OpMessage.pm
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

View File

@@ -1,6 +1,6 @@
---
name: SOAP-WSDL
version: 2.00_18
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:
@@ -104,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:
@@ -128,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:
@@ -235,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:
@@ -246,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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -18,15 +18,38 @@ 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;
$self->generate_typelib();
$self->generate_interface();
$self->generate_typemap();
my $opt = shift;
$self->generate_typelib( $opt );
$self->generate_interface( $opt );
$self->generate_typemap( $opt );
}
sub generate_typelib {
@@ -54,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');
}
}
}
@@ -90,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

@@ -178,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
@@ -192,12 +199,30 @@ No additional processing or content checking is performed yet.
complexType
restriction
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.
=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
@@ -217,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.
@@ -244,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

@@ -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

@@ -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

@@ -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,7 +30,7 @@ my $soap;
#2
ok( $soap = SOAP::WSDL->new(
wsdl => 'file://' . $path . '/../../acceptance/wsdl/03_complexType-all.wsdl',
wsdl => 'file://' . $url . '/../../acceptance/wsdl/03_complexType-all.wsdl',
), 'Instantiated object' );
#3

View File

@@ -12,14 +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',
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

@@ -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

@@ -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

@@ -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

@@ -84,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>
@@ -155,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">