import SOAP-WSDL 2.00_25 from CPAN

git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_25
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_25.tar.gz
This commit is contained in:
Martin Kutter
2009-12-12 19:48:11 -08:00
committed by Michael G. Schwern
parent 84b53d9261
commit a9033164e6
177 changed files with 3449 additions and 2063 deletions
+16 -16
View File
@@ -1,16 +1,20 @@
package SOAP::WSDL;
use strict;
use warnings;
use 5.008; # require at least perl 5.8
use vars qw($AUTOLOAD);
use Carp;
use Scalar::Util qw(blessed);
use SOAP::WSDL::Client;
use SOAP::WSDL::Expat::WSDLParser;
use Class::Std;
use Class::Std::Fast;
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
use LWP::UserAgent;
our $VERSION='2.00_17';
our $VERSION= '2.00_25';
my %no_dispatch_of :ATTR(:name<no_dispatch>);
my %wsdl_of :ATTR(:name<wsdl>);
@@ -81,7 +85,7 @@ for my $method (keys %LOOKUP ) {
sub new {
my ($class, %args_from) = @_;
my $self = \do { my $foo = undef };
my $self = \do { my $foo = Class::Std::Fast::ID() };
bless $self, $class;
for (keys %args_from) {
my $method = $self->can("set_$_")
@@ -116,9 +120,7 @@ sub wsdlinit {
# sanity checks
my $types = $wsdl_definitions->first_types()
or croak "unable to extract schema from WSDL";
my $ns = $wsdl_definitions->get_xmlns()
or croak "unable to extract XML Namespaces" . $wsdl_definitions->to_string;
( %{ $ns } ) or croak "unable to extract XML Namespaces";
my $ns = $wsdl_definitions->get_xmlns();
# setup lookup variables
$definitions_of{ $ident } = $wsdl_definitions;
@@ -153,7 +155,7 @@ sub _wsdl_get_binding :PRIVATE {
my $self = shift;
my $ident = ident $self;
my $wsdl = $definitions_of{ $ident };
my $port = $port_of{ $ident } || $self->_wsdl_get_port();
my $port = $self->_wsdl_get_port();
$binding_of{ $ident } = $wsdl->find_binding( $port->expand( $port->get_binding() ) )
or croak "no binding found for ", $port->get_binding();
return $binding_of{ $ident };
@@ -162,7 +164,7 @@ sub _wsdl_get_portType :PRIVATE {
my $self = shift;
my $ident = ident $self;
my $wsdl = $definitions_of{ $ident };
my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding();
my $binding = $self->_wsdl_get_binding();
$porttype_of{ $ident } = $wsdl->find_portType( $binding->expand( $binding->get_type() ) )
or croak "cannot find portType for " . $binding->get_type();
return $porttype_of{ $ident };
@@ -175,13 +177,11 @@ sub _wsdl_init_methods :PRIVATE {
# get bindings, portType, message, part(s) - use private methods for clear separation...
$self->_wsdl_get_service if not ($service_of{ $ident });
my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding()
|| croak "Can't find binding";
my $portType = $porttype_of{ $ident } || $self->_wsdl_get_portType();
$self->_wsdl_get_portType();
$method_info_of{ $ident } = {};
foreach my $binding_operation (@{ $binding->get_operation() })
foreach my $binding_operation (@{ $binding_of{ $ident }->get_operation() })
{
my $method = {};
@@ -193,7 +193,7 @@ sub _wsdl_init_methods :PRIVATE {
# get parts
# 1. get operation from port
my $operation = $portType->find_operation( $ns,
my $operation = $porttype_of{ $ident }->find_operation( $ns,
$binding_operation->get_name() );
# 2. get input message name
@@ -236,7 +236,7 @@ sub _wsdl_init_methods :PRIVATE {
sub call {
my ($self, $method, @data_from) = @_;
my $ident = ident $self;
my $ident = ${ $self };
my ($data, $header) = ref $data_from[0]
? ($data_from[0], $data_from[1] )
@@ -730,9 +730,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: WSDL.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: WSDL.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
=cut
+7 -10
View File
@@ -1,11 +1,11 @@
package SOAP::WSDL::Base;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use List::Util qw(first);
use Carp qw(croak carp confess);
our $VERSION='2.00_17';
our $VERSION='2.00_25';
my %id_of :ATTR(:name<id> :default<()>);
my %name_of :ATTR(:name<name> :default<()>);
@@ -91,13 +91,8 @@ sub init {
{
croak @args if (not defined ($value->{ Name }));
if ($value->{ Name } =~m{^xmlns\:}xms) {
croak $xmlns_of{ ident $self }
if ref $xmlns_of{ ident $self } ne 'HASH';
# add namespaces
$xmlns_of{ ident $self }->{ $value->{ Value } } =
$value->{ LocalName };
$xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value };
next;
}
elsif ($value->{ Name } =~m{^xmlns$}xms) {
@@ -116,13 +111,15 @@ sub init {
sub expand {
my ($self, , $qname) = @_;
my ($prefix, $localname) = split /:/x, $qname;
my %ns_map = reverse %{ $self->get_xmlns() };
# my %ns_map = reverse %{ $self->get_xmlns() };
my %ns_map = %{ $self->get_xmlns() };
return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix });
if (my $parent = $self->get_parent()) {
return $parent->expand($qname);
}
confess "unbound prefix $prefix found for $prefix:$localname";
confess "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are"
. join(', ', keys %ns_map);
}
sub _expand;
*_expand = \&expand;
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::Binding;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use List::Util qw(first);
use base qw(SOAP::WSDL::Base);
+5 -5
View File
@@ -3,7 +3,7 @@ use strict;
use warnings;
use Carp;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use SOAP::WSDL::Factory::Deserializer;
@@ -11,7 +11,7 @@ use SOAP::WSDL::Factory::Serializer;
use SOAP::WSDL::Factory::Transport;
use SOAP::WSDL::Expat::MessageParser;
our $VERSION = '2.00_17';
our $VERSION = '2.00_25';
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
my %no_dispatch_of :ATTR(:name<no_dispatch> :default<()>);
@@ -42,7 +42,7 @@ sub get_proxy { ## no critic RequireArgUnpacking
sub set_proxy {
my ($self, @args_from) = @_;
my $ident = ident $self;
my $ident = ${ $self };
# remember old value to return it later - Class::Std does so, too
my $old_value = $transport_of{ $ident };
@@ -371,9 +371,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Client.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: Client.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
=cut
+35 -35
View File
@@ -4,7 +4,7 @@ use warnings;
use base 'SOAP::WSDL::Client';
use Scalar::Util qw(blessed);
our $VERSION = '2.00_24';
our $VERSION = '2.00_25';
sub call {
my ($self, $method, $body, $header) = @_;
@@ -26,38 +26,38 @@ sub call {
return $self->SUPER::call($method, $body, $header);
}
sub __create_methods {
my ($package, %info_of) = @_;
no strict qw(refs);
no warnings qw(redefine);
for my $method (keys %info_of){
my ($soap_action, @parts);
# up to 2.00_10 we had list refs...
if (ref $info_of{ $method }eq 'HASH') {
@parts = @{ $info_of{ $method }->{ parts } };
$soap_action = $info_of{ $method }->{ soap_action };
}
else {
die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
}
*{ "$package\::$method" } = sub {
my $self = shift;
my @param = map {
my $data = shift || {};
eval "require $_";
$_->new( $data );
} @parts;
return $self->SUPER::call( {
operation => $method,
soap_action => $soap_action,
}, @param );
}
}
}
#sub __create_methods {
# my ($package, %info_of) = @_;
#
# no strict qw(refs);
# no warnings qw(redefine);
# for my $method (keys %info_of){
# my ($soap_action, @parts);
#
# # up to 2.00_10 we had list refs...
# if (ref $info_of{ $method }eq 'HASH') {
# @parts = @{ $info_of{ $method }->{ parts } };
# $soap_action = $info_of{ $method }->{ soap_action };
# }
# else {
# die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
# }
#
# *{ "$package\::$method" } = sub {
# my $self = shift;
# my @param = map {
# my $data = shift || {};
# eval "require $_";
# $_->new( $data );
# } @parts;
#
# return $self->SUPER::call( {
# operation => $method,
# soap_action => $soap_action,
# }, @param );
# }
# }
#}
1;
@@ -94,9 +94,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Base.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: Base.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
=cut
+4 -4
View File
@@ -6,10 +6,10 @@ use Carp;
use File::Basename;
use File::Path;
use List::Util qw(first);
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
our $VERSION='2.00_17';
our $VERSION='2.00_25';
my %types_of :ATTR(:name<types> :default<[]>);
my %message_of :ATTR(:name<message> :default<()>);
@@ -118,9 +118,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Definitions.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: Definitions.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
=cut
+4 -4
View File
@@ -1,14 +1,14 @@
package SOAP::WSDL::Deserializer::Hash;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use SOAP::WSDL::SOAP::Typelib::Fault11;
use SOAP::WSDL::Expat::Message2Hash;
use SOAP::WSDL::Factory::Deserializer;
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
our $VERSION='2.00_24';
our $VERSION='2.00_25';
sub BUILD {
my ($self, $ident, $args_of_ref) = @_;
@@ -152,9 +152,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Hash.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: Hash.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
=cut
+10 -10
View File
@@ -1,14 +1,16 @@
package SOAP::WSDL::Deserializer::XSD;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use SOAP::WSDL::SOAP::Typelib::Fault11;
use SOAP::WSDL::Expat::MessageParser;
our $VERSION='2.00_24';
our $VERSION='2.00_25';
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
my %parser_of :ATTR();
sub BUILD {
my ($self, $ident, $args_of_ref) = @_;
@@ -16,16 +18,14 @@ sub BUILD {
for (keys %{ $args_of_ref }) {
delete $args_of_ref->{ $_ } if $_ ne 'class_resolver';
}
}
sub deserialize {
my ($self, $content) = @_;
my $parser = SOAP::WSDL::Expat::MessageParser->new({
class_resolver => $class_resolver_of{ ident $self },
});
eval { $parser->parse_string( $content ) };
$parser_of{ ${ $self } } ||= SOAP::WSDL::Expat::MessageParser->new();
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
eval { $parser_of{ ${ $self } }->parse_string( $content ) };
if ($@) {
return $self->generate_fault({
code => 'soap:Server',
@@ -34,7 +34,7 @@ sub deserialize {
. "Message was: \n$content"
});
}
return ( $parser->get_data(), $parser->get_header() );
return ( $parser_of{ ${ $self } }->get_data(), $parser_of{ ${ $self } }->get_header() );
}
sub generate_fault {
@@ -98,9 +98,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: XSD.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
=cut
+121 -65
View File
@@ -2,10 +2,19 @@
package SOAP::WSDL::Expat::MessageParser;
use strict;
use warnings;
use Carp qw(croak confess);
our $VERSION = q{2.00_25};
use SOAP::WSDL::XSD::Typelib::Builtin;
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = '2.00_24';
require Class::Std::Fast;
my $OBJECT_CACHE_REF = Class::Std::Fast::OBJECT_CACHE_REF();
my %LOADED_OF = ();
sub new {
my ($class, $args) = @_;
@@ -13,16 +22,41 @@ sub new {
class_resolver => $args->{ class_resolver },
strict => exists $args->{ strict } ? $args->{ strict } : 1,
};
bless $self, $class;
$self->load_classes() if ($args->{ class_resolver });
return $self;
}
sub class_resolver {
my $self = shift;
$self->{ class_resolver } = shift if @_;
if (@_) {
$self->{ class_resolver } = shift;
$self->load_classes();
}
return $self->{ class_resolver };
}
sub load_classes {
my $self = shift;
return if $LOADED_OF{ $self->{ class_resolver } };
for (values %{ $self->{ class_resolver }->get_typemap }) {
no strict qw(refs);
my $class = $_;
# a bad test - do you know a better one?
next if $class eq '__SKIP__';
next if defined @{ "$class\::ISA"}; # check if namespace exists
$class =~s{ :: }{/}xmsg;
$class .= '.pm';
require $class;
}
$LOADED_OF{ $self->{ class_resolver } } = 1;
}
sub _initialize {
my ($self, $parser) = @_;
$self->{ parser } = $parser;
@@ -31,13 +65,15 @@ sub _initialize {
delete $self->{ header };
my $characters;
#my @characters_from = ();
# Note: $current MUST be undef - it is used as sentinel
# on the object stack via if (! defined $list->[-1])
# DON'T set it to anything else !
my $current = undef;
my $list = []; # node list
my $list = []; # node list (object stack)
my $path = []; # current path
my $skip = 0; # skip elements
my $current_part = q{}; # are we in header or body ?
my $depth = 0;
my %content_check = $self->{strict}
@@ -65,28 +101,32 @@ sub _initialize {
)
: ();
# use "globals" for speed
my ($_prefix, $_method,
$_class, $_leaf) = ();
my $char_handler = sub {
# push @characters_from, $_[1] if $_[1] =~m{ [^s] }xms;
$characters .= $_[1] if $_[1] =~m{ [^\s] }xms;
return if (!$_leaf); # we only want characters in leaf nodes
$characters .= $_[1];
# if $_[1] =~m{ [^\s] }xms;
return;
};
# use "globals" for speed
my ($_prefix, $_method,
$_class) = ();
no strict qw(refs);
$parser->setHandlers(
Start => sub {
# my ($parser, $element, %_attrs) = @_;
# $depth = $parser->depth();
$_leaf = 1; # believe we're a leaf node until we see an end
# call methods without using their parameter stack
# That's slightly faster than $content_check{ $depth }->()
# and we don't have to pass $_[1] to the method.
# Yup, that's dirty.
return &{$content_check{ $depth }} if exists $content_check{ $depth };
return &{$content_check{ $depth }}
if exists $content_check{ $depth };
push @{ $path }, $_[1]; # step down in path
return if $skip; # skip inside __SKIP__
@@ -102,31 +142,35 @@ sub _initialize {
return;
}
push @$list, $current; # step down in tree (remember current)
# step down in tree (remember current)
#
# on the first object (after skipping Envelope/Body), $current
# is undef.
# We put it on the stack, anyway, and use it as sentinel when
# going through the closing tags in the End handler
#
push @$list, $current;
$characters = q(); # empty characters
# cleanup. Mainly here to help profilers find the real hot spots
undef $current;
# Check whether we have a builtin - we implement them as classes
# We could replace this with UNIVERSAL->isa() - but it's slow...
# match is a bit faster if the string does not match, but WAY slower
# if $class matches. We hope to match often...
if (index $_class, 'SOAP::WSDL::XSD::Typelib::Builtin', 0 < 0) {
# check wheter there is a non-empty ARRAY reference for $_class::ISA
# or a "new" method
# If not, require it - all classes required here MUST
# define new()
# This is not exactly the same as $class->can('new'), but it's way faster
defined *{ "$_class\::new" }{ CODE }
or scalar @{ *{ "$_class\::ISA" }{ ARRAY } }
or eval "require $_class" ## no critic qw(ProhibitStringyEval)
or die $@;
# cleanup
$characters = q{};
# Create and set new objects using Class::Std::Fast's object cache
# if possible, or blessing directly into the class in question
# (circumventing constructor) here.
# That's dirty, but fast.
#
# The alternative would read:
# $current = $_class->new({ @_[2..$#_] });
#
$current = pop @{ $OBJECT_CACHE_REF->{ $_class } };
if (not defined $current) {
my $o = Class::Std::Fast::ID();
$current = bless \$o, $_class;
}
$current = $_class->new({ @_[2..$#_] }); # set new current object
# remember top level element
exists $self->{ data }
or ($self->{ data } = $current);
$depth++;
return;
},
@@ -134,8 +178,10 @@ sub _initialize {
Char => $char_handler,
End => sub {
pop @{ $path }; # step up in path
# check __SKIP__
if ($skip) {
return if $skip ne join '/', @{ $path }, $_[1];
$skip = 0;
@@ -145,30 +191,38 @@ sub _initialize {
$depth--;
# This one easily handles ignores for us, too...
return if not ref $list->[-1];
# return if there's only one elment - can't set it in parent ;-)
# but set as root element if we don't have one already.
if (not defined $list->[-1]) {
$self->{ data } = $current if (not exists $self->{ data });
return;
};
# set characters in current if we are a simple type
# we may have characters in complexTypes with simpleContent,
# too - maybe we should rely on the presence of characters ?
# may get a speedup by defining a ident method in anySimpleType
# and looking it up via exists &$class::ident;
# if ( $current->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType') ) {
# $current->set_value( $characters );
# }
# currently doesn't work, as anyType does not implement value -
# maybe change ?
$current->set_value( $characters ) if (length $characters);
#$current->set_value( join @characters_from ) if (@characters_from);
# we only set character values in leaf nodes
if ($_leaf) {
# Use dirty but fast access via global variables.
#
# The normal way (via method) would be this:
#
# $current->set_value( $characters ) if (length($characters));
#
$SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType::___value
->{ $$current } = $characters if $characters =~m{ [^\s] }xms;
}
# empty characters
$characters = q{};
# undef @characters_from;
# set appropriate attribute in last element
# multiple values must be implemented in base class
#$_method = "add_$_localname";
# $_method = "add_$_localname";
$_method = "add_$_[1]";
$list->[-1]->$_method( $current );
$current = pop @$list; # step up in object hierarchy...
$current = pop @$list; # step up in object hierarchy
$_leaf = 0; # stop believing we're a leaf node
return;
}
);
@@ -206,7 +260,8 @@ See L<SOAP::WSDL::Manual::Parser> for details.
Sometimes there's unneccessary information transported in SOAP messages.
To skip XML nodes (including all child nodes), just edit the type map for
the message and set the type map entry to '__SKIP__'.
the message, set the type map entry to '__SKIP__', and comment out all
child elements you want to skip.
=head1 Bugs and Limitations
@@ -220,22 +275,23 @@ the message and set the type map entry to '__SKIP__'.
=back
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself.
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
Replace the whitespace by @ for E-Mail Address.
=head1 REPOSITORY INFORMATION
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
$Rev: 391 $
=head1 COPYING
This module may be used under the same terms as perl itself.
=head1 Repository information
$ID: $
$LastChangedDate: 2007-12-02 23:20:24 +0100 (So, 02 Dez 2007) $
$LastChangedRevision: 427 $
$LastChangedBy: kutterma $
$Id: MessageParser.pm 391 2007-11-17 21:56:13Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
=cut
+2
View File
@@ -5,6 +5,8 @@ use Carp;
use SOAP::WSDL::TypeLookup;
use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = q{2.00_25};
sub _initialize {
my ($self, $parser) = @_;
+4 -4
View File
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Transport;
use strict;
use warnings;
our $VERSION='2.00_17';
our $VERSION='2.00_25';
# class data
my %registered_transport_of = ();
@@ -27,7 +27,7 @@ my %SOAP_WSDL_TRANSPORT_OF = (
# class methods only
sub register {
my ($class, $scheme, $package) = @_;
die "cannot use reference as scheme" if ref $scheme;
die "Cannot use reference as scheme" if ref $scheme;
$registered_transport_of{ $scheme } = $package;
}
@@ -236,9 +236,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Transport.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: Transport.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
=cut
+11 -6
View File
@@ -1,12 +1,13 @@
package SOAP::WSDL::Generator::Template;
use strict;
use Template;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
our $VERSION='2.00_17';
our $VERSION=q{2.00_25};
my %tt_of :ATTR(:get<tt>);
my %definitions_of :ATTR(:name<definitions> :default<()>);
my %server_prefix_of :ATTR(:name<server_prefix> :default<MyServer>);
my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterfaces>);
my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
@@ -23,17 +24,21 @@ sub START {
sub _process :PROTECTED {
my ($self, $template, $arg_ref, $output) = @_;
my $ident = ident $self;
my $tt = $tt_of{$ident} ||= Template->new(
$tt_of{$ident} = Template->new(
DEBUG => 1,
EVAL_PERL => $EVAL_PERL_of{ $ident },
RECURSION => $RECURSION_of{ $ident },
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
);
$tt->process( $template,
)
if (not $tt_of{ $ident });
$tt_of{ $ident }->process( $template,
{
definitions => $self->get_definitions,
interface_prefix => $self->get_interface_prefix,
server_prefix => $self->get_server_prefix,
type_prefix => $self->get_type_prefix,
typemap_prefix => $self->get_typemap_prefix,
TYPE_PREFIX => $self->get_type_prefix,
@@ -42,7 +47,7 @@ sub _process :PROTECTED {
%{ $arg_ref }
},
$output)
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error();
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt_of{ $ident }->error();
}
1;
+38 -5
View File
@@ -1,10 +1,12 @@
package SOAP::WSDL::Generator::Template::XSD;
use strict;
use Template;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use File::Basename;
use File::Spec;
our $VERSION = q{2.00_25};
use SOAP::WSDL::Generator::Visitor::Typemap;
use SOAP::WSDL::Generator::Visitor::Typelib;
use base qw(SOAP::WSDL::Generator::Template);
@@ -32,7 +34,7 @@ sub BUILD {
);
$dir = File::Spec->catdir($dir, $file, 'XSD');
# return path put together...
my $path = File::Spec->catpath( $volume, $dir );
my $path = File::Spec->catpath( $volume, $dir , q{});
# Fixup path for windows - / works fine, \ does
# not...
@@ -48,7 +50,7 @@ sub generate {
my $self = shift;
my $opt = shift;
$self->generate_typelib( $opt );
$self->generate_interface( $opt );
# $self->generate_interface( $opt );
$self->generate_typemap( $opt );
}
@@ -63,11 +65,42 @@ sub generate_typelib {
return;
}
sub generate_server {
my $self = shift;
my $ident = ident $self;
my $arg_ref = shift;
for my $service (@{ $self->get_definitions->get_service }) {
for my $port (@{ $service->get_port() }) {
# Skip ports without (known) address
next if not $port->first_address;
next if not $port->first_address->isa('SOAP::WSDL::SOAP::Address');
my $port_name = $port->get_name;
$port_name =~s{ \A .+\. }{}xms;
my $output = $arg_ref->{ output }
? $arg_ref->{ output }
: $self->_generate_filename(
$self->get_server_prefix(),
$service->get_name(),
$port_name,
);
print "Creating interface class $output\n";
$self->_process('Server.tt',
{
service => $service,
port => $port,
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
},
$output, binmode => ':utf8');
}
}
}
sub generate_interface {
my $self = shift;
my $ident = ident $self;
my $arg_ref = shift;
my $tt = $self->get_tt();
for my $service (@{ $self->get_definitions->get_service }) {
for my $port (@{ $service->get_port() }) {
# Skip ports without (known) address
@@ -105,7 +138,7 @@ sub generate_typemap {
typemap => {
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
%{ $typemap_of{ident $self }},
@@ -1,7 +1,7 @@
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
@@ -0,0 +1,97 @@
package [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class');
my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
my %transport_of :ATTR(:name<transport> :default<()>);
my %dispatch_to :ATTR(:name<dispatch_to>);
my $action_map_ref = {
[% binding = definitions.find_binding( port.expand( port.get_binding ) );
FOREACH operation = binding.get_operation;
- %]
'[% operation.first_operation.get_soapAction %]' => '[% operation.get_name %]',
[% END %]
};
sub START {
my ($self, $ident, $arg_ref) = @_;
eval "require $transport_class_of{ $ident }"
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
action_map_ref => $action_map_ref,
class_resolver => '[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]',
dispatch_to => $dispatch_to{ $ident },
});
}
sub handle {
$transport_of{ ${ $_[0] } }->handle();
}
1;
[% IF NO_POD; STOP; END %]
__END__
=pod
=head1 NAME
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Server Class for the [% service.get_name %] Web Service
=head1 SYNOPSIS
use [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %];
my $server = [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new({
dispatch_to => 'My::Handler::Class',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
});
$server->handle();
=head1 DESCRIPTION
SOAP Server handler for the [% service.get_name %] web service
located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %]
[% service.get_documentation %]
=head2 Port [% port.get_name %]
[% port.get_documentation %]
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
The C<dispatch_to> argument is mandatory. It must be a class or object
implementing the SOAP Service methods listed below.
=head2 SOAP Service methods
[% INCLUDE Server/POD/method_info.tt %]
[% FOREACH operation = binding.get_operation;
%][% INCLUDE Server/POD/Operation.tt %]
[% END %]
=head1 AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
=pod
@@ -0,0 +1,9 @@
[%
message_name = port_op.first_output.get_message();
# message_name;
part_from = definitions.find_message( port_op.first_output.expand( message_name ) ).get_part;
FOREACH part = part_from;
INCLUDE Server/POD/OutPart.tt(part = part);
END;
%]
@@ -0,0 +1,15 @@
=head3 [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
port_op.get_documentation %]
sub [% operation.get_name %](
my ($self, $body, $header) = @_;
# body is a ??? object - sorry, POD not implemented yet
# header is a ??? object - sorry, POD not implemented yet
# do something with body and header...
return [% INCLUDE Server/POD/Message.tt %]
}
@@ -0,0 +1,10 @@
[% element = definitions.first_types.find_element( part.expand( part.get_element ) );
#element.get_name();
#element;
#STOP;
-%]
[% element_prefix %]::[% element.get_name.replace('\.', '::') %]->new([%
type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type(
element.expand( element.get_type ) );
INCLUDE Interface/POD/Type.tt; %]
);
@@ -0,0 +1,4 @@
Your dispatch_to class has to implement the following methods:
The examples below serve as copy-and-paste prototypes to use in your
class.
@@ -10,6 +10,10 @@ sub get_class {
return $typemap_1->{ $name };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__
@@ -1,6 +1,8 @@
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
[%
atomic_types = {};
+2 -2
View File
@@ -1,9 +1,9 @@
package SOAP::WSDL::Generator::Visitor;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
our $VERSION = '2.00_17';
our $VERSION = q{2.00_25};
my %definitions_of :ATTR(:name<definitions> :default<()>);
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
+48 -20
View File
@@ -1,10 +1,12 @@
package SOAP::WSDL::Generator::Visitor::Typemap;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Generator::Visitor);
our $VERSION = q{2.00_25};
my %path_of :ATTR(:name<path> :default<[]>);
my %typemap_of :ATTR(:name<typemap> :default<()>);
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
@@ -18,6 +20,7 @@ sub START {
sub set_typemap_entry {
my ($self, $value) = @_;
# warn join( q{/}, @{ $path_of{ ident $self } }) . " => $value";
$typemap_of{ ident $self }->{
join( q{/}, @{ $path_of{ ident $self } } )
} = $value;
@@ -145,16 +148,21 @@ sub process_referenced_type {
# get type's class name
# Caveat: visits type if it's a referenced type from the
# a ? b : c operation.
my $typeclass =
( $ns eq 'http://www.w3.org/2001/XMLSchema' )
? "SOAP::WSDL::XSD::Typelib::Builtin::$localname"
: do {
my $type =
$self->get_definitions()->first_types()->find_type( $ns, $localname );
$type->_accept($self);
join( q{::}, $type_prefix_of{$ident}, $type->get_name() );
};
my ($type, $typeclass);
if ( $ns eq 'http://www.w3.org/2001/XMLSchema' ) {
$typeclass = "SOAP::WSDL::XSD::Typelib::Builtin::$localname";
}
else {
$type = $self->get_definitions()->first_types()->find_type( $ns, $localname );
$typeclass = join( q{::}, $type_prefix_of{$ident}, $type->get_name() );
}
# set before to allow it to be used from inside _accept
$self->set_typemap_entry($typeclass);
$type->_accept($self) if ($type);
# set afterwards again (just to be sure...)
$self->set_typemap_entry($typeclass);
return $self;
}
@@ -171,8 +179,10 @@ sub process_atomic_type {
sub visit_XSD_Element {
my ( $self, $ident, $element ) = ( $_[0], ident $_[0], $_[1] );
# TODO: what about element ref="" ?
# when we're hopping from one element to the next one...
# warn "simpleType " . $element->get_name();
my @path = @{ $path_of{ ${ $self } } };
my $path = join '/', @path;
my $parent = $typemap_of{ ${ $self } }->{ $path };
# step down in tree
$self->add_element_path( $element );
@@ -181,25 +191,43 @@ sub visit_XSD_Element {
# They all just return if no argument is given,
# and return $self on success.
SWITCH: {
if ($element->get_type) {
$self->process_referenced_type( $element->expand( $element->get_type() ) )
if ($element->get_type) {
$self->process_referenced_type( $element->expand( $element->get_type() ) )
&& last;
}
# for atomic simple and comples types , and ref elements
# atomic simpleType typemap rule:
# if we have a parent, use parent's sub-package.
# if not, use element package.
if ($element->get_simpleType()) {
# warn "simpleType " . $element->get_name();
my @path = @{ $path_of{ ${ $self } } };
my $typeclass = defined ($parent)
? join '::_', $parent , $element->get_name()
: join q{::}, $element_prefix_of{$ident}, $element->get_name();
$self->set_typemap_entry($typeclass);
last SWITCH;
}
# for atomic and complex types , and ref elements
my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name();
$self->set_typemap_entry($typeclass);
# kind of double-dispatch: returns true on success, but does nothing
$self->process_atomic_type( $element->first_simpleType() )
&& last;
$self->process_atomic_type( $element->first_complexType()
, sub { $_[1]->_accept($_[0]) } )
&& last;
# TODO: add element ref handling
};
# Safety measure. If someone defines a top-level element with
# a normal (not atomic) type, we just override it here
if (not defined($parent)) {
# for atomic and complex types , and ref elements
my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name();
$self->set_typemap_entry($typeclass);
}
# step up in hierarchy
pop @{ $path_of{$ident} };
}
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::Message;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
my %part_of :ATTR(:name<part> :default<[]>);
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::OpMessage;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
my %body_of :ATTR(:name<body> :default<[]>);
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::Operation;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
my %operation_of :ATTR(:name<operation> :default<()>);
+2 -2
View File
@@ -2,7 +2,7 @@ package SOAP::WSDL::Part;
use strict;
use warnings;
use Carp qw(croak);
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
@@ -16,7 +16,7 @@ sub serialize
my $data = shift;
my $opt = shift;
my $typelib = $opt->{ typelib } || die "No typelib";
my %ns_map = reverse %{ $opt->{ namespace } };
my %ns_map = %{ $opt->{ namespace } };
my $item_name;
if ($item_name = $self->get_type() ) {
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::Port;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
my %binding_of :ATTR(:name<binding> :default<()>);
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::PortType;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
my %operation_of :ATTR(:name<operation> :default<()>);
+1 -3
View File
@@ -1,9 +1,7 @@
package SOAP::WSDL::SOAP::Address;
use strict;
use warnings;
use Class::Std::Storable;
use base qw(SOAP::WSDL::Base);
use Class::Std::Fast::Storable;
my %location :ATTR(:name<location> :default<()>);
1;
+1 -1
View File
@@ -2,7 +2,7 @@ package SOAP::WSDL::SOAP::Body;
use strict;
use warnings;
use base qw(SOAP::WSDL::Base);
use Class::Std::Fast::Storable;
my %use_of :ATTR(:name<use> :default<q{}>);
my %namespace_of :ATTR(:name<namespace> :default<q{}>);
my %encodingStyle_of :ATTR(:name<encodingStyle> :default<q{}>);
+1 -1
View File
@@ -2,7 +2,7 @@ package SOAP::WSDL::SOAP::Header;
use strict;
use warnings;
use base qw(SOAP::WSDL::Base);
use Class::Std::Fast::Storable;
my %use_of :ATTR(:name<use> :default<q{}>);
my %namespace_of :ATTR(:name<namespace> :default<q{}>);
my %encodingStyle_of :ATTR(:name<encodingStyle> :default<q{}>);
+2 -2
View File
@@ -1,10 +1,10 @@
package SOAP::WSDL::SOAP::Operation;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
our $VERSION='2.00_17';
our $VERSION=q{2.00_25};
my %style_of :ATTR(:name<style> :default<()>);
my %soapAction_of :ATTR(:name<soapAction> :default<()>);
+5 -5
View File
@@ -1,9 +1,9 @@
package SOAP::WSDL::SOAP::Typelib::Fault11;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
our $VERSION='2.00_17';
our $VERSION=q{2.00_25};
use SOAP::WSDL::XSD::Typelib::ComplexType;
use SOAP::WSDL::XSD::Typelib::Element;
@@ -45,7 +45,7 @@ __PACKAGE__->__set_ref('');
# always return false in boolean context - a fault is never true...
sub as_bool : BOOLIFY { return; }
Class::Std::initialize();
1;
=pod
@@ -101,9 +101,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Fault11.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: Fault11.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm $
=cut
+4 -4
View File
@@ -2,9 +2,9 @@
package SOAP::WSDL::Serializer::XSD;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
our $VERSION='2.00_24';
our $VERSION=q{2.00_25};
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
@@ -113,9 +113,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: XSD.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
=cut
+181
View File
@@ -0,0 +1,181 @@
package SOAP::WSDL::Server;
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use SOAP::WSDL::Factory::Deserializer;
use SOAP::WSDL::Factory::Serializer;
our $VERSION = q{2.00_25};
my %dispatch_to_of :ATTR(:name<dispatch_to> :default<()>);
my %action_map_ref_of :ATTR(:name<action_map_ref> :default<{}>);
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
my %deserializer_of :ATTR(:name<deserializer> :default<()>);
my %serializer_of :ATTR(:name<serializer> :default<()>);
sub handle {
my $self = shift;
my $ident = ident $self;
# this involves copying the request...
my $request = shift; # once
# we only support 1.1 now...
$deserializer_of{ $ident } ||= SOAP::WSDL::Factory::Deserializer->get_deserializer({
soap_version => '1.1'
});
$serializer_of{ $ident } ||= SOAP::WSDL::Factory::Serializer->get_serializer({
soap_version => '1.1'
});
# TODO: factor out dispatcher logic into dispatcher factory + dispatcher
# classes
# $dispatcher_of{ $ident } ||= SOAP::WSDL::Factory::Dispatcher->get_dispatcher({});
# set class resolver if deserializer supports it
$deserializer_of{ $ident }->set_class_resolver( $class_resolver_of{ $ident } )
if ( $deserializer_of{ $ident }->can('set_class_resolver') );
# Try deserializing response
my ($body, $header) = eval {
$deserializer_of{ $ident }->deserialize( $request->content() );
};
if ($@) {
die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server',
role => 'urn:localhost',
message => "Error deserializing message: $@. \n"
});
};
if (blessed($body) && $body->isa('SOAP::WSDL::SOAP::Typelib::Fault11')) {
die $body;
}
# lookup method name by SOAPAction
my $soap_action = $request->header('SOAPAction');
$soap_action = '' if not defined $soap_action;
$soap_action =~s{ \A(?:"|')(.+)(?:"|') \z }{$1}xms;
my $method_name = $action_map_ref_of{ $ident }->{ $soap_action };
# $dispatcher_of{ $ident }->dispatch({
# soap_action => $soap_action,
# request_body => $body,
# request_header => $header,
# });
if (!$dispatch_to_of{ $ident }) {
die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server',
role => 'urn:localhost',
message => "No handler registered",
});
};
if (! defined $request->header('SOAPAction') ) {
die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server',
role => 'urn:localhost',
message => "Not found: No SOAPAction given",
});
};
if (! defined $method_name) {
die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server',
role => 'urn:localhost',
message => "Not found: No method found for the SOAPAction '$soap_action'",
});
};
# find method in handling class/object
my $method_ref = $dispatch_to_of{ $ident }->can($method_name);
if (!$method_ref) {
die $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server',
role => 'urn:localhost',
message => "Not implemented: The handler does not implement the method $method_name",
});
};
my ($response_body, $response_header) = $method_ref->($dispatch_to_of{ $ident }, $body, $header );
return $serializer_of{ $ident }->serialize({
body => $response_body,
header => $response_header,
});
}
1;
=pod
=head1 NAME
SOAP::WSDL::Server - WSDL based SOAP server base class
=head1 SYNOPSIS
Don't use directly, use the SOAP::WSDL::Server::* subclasses
instead.
=head1 DESCRIPTION
SOAP::WSDL::Server basically follows the architecture sketched below
(though dispatcher classes are not implemented yet)
SOAP Request SOAP Response
| ^
V |
------------------------------------------
| SOAP::WSDL::Server |
| -------------------------------------- |
| | Transport Class | |
| |--------------------------------------| |
| | Deserializer | Serializer | |
| |--------------------------------------| |
| | Dispatcher | |
| -------------------------------------- |
------------------------------------------
| calls ^
v | returns
-------------------------------------
| Handler |
-------------------------------------
All of the components (Transport class, deserializer, dispatcher and
serializer) are implemented as plugins.
The architecture is not implemented as planned yet, but the dispatcher is
currently part of SOAP::WSDL::Server, which aggregates serializer and
deserializer, and is subclassed by transport classes (of which
SOAP::WSDL::Server::CGI is the only implemented one yet).
The dispatcher is currently based on the SOAPAction header. This does not
comply to the WS-I basic profile, which declares the SOAPAction as optional.
The final dispatcher will be based on wire signatures (i.e. the classes
of the deserialized messages).
A hash-based dispatcher could be implemented by examining the top level
hash keys.
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under the same
terms as perl itself
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$LastChangedBy: kutterma $
$Id: Client.pm 391 2007-11-17 21:56:13Z kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
=cut
+134
View File
@@ -0,0 +1,134 @@
package SOAP::WSDL::Server::CGI;
use strict;
use warnings;
use HTTP::Request;
use HTTP::Response;
use HTTP::Status;
use HTTP::Headers;
use Scalar::Util qw(blessed);
use Class::Std::Fast::Storable;
# use Class::Std::Storable;
use base qw(SOAP::WSDL::Server);
our $VERSION=q{2.00_25};
# mostly copied from SOAP::Lite. Unfortunately we can't use SOAP::Lite's CGI
# server directly - we would have to swap out it's base class...
#
# This should be a warning for us: We should not handle methods via inheritance,
# but via some plugin mechanism, to allow alternative handlers to be plugge
# in.
sub handle {
my $self = shift;
my $response;
my $length = $ENV{'CONTENT_LENGTH'} || 0;
if (!$length) {
$response = HTTP::Response->new(411); # LENGTH REQUIRED
$self->_output($response);
return;
}
if (exists $ENV{EXPECT} && $ENV{EXPECT} =~ /\b100-Continue\b/i) {
print "HTTP/1.1 100 Continue\r\n\r\n";
}
my $content = q{};
my $buffer;
binmode(STDIN);
while (read(STDIN,$buffer,$length - length($content))) {
$content .= $buffer;
}
my $request = HTTP::Request->new(
$ENV{'REQUEST_METHOD'} || '' => $ENV{'SCRIPT_NAME'},
HTTP::Headers->new(
map {
(/^HTTP_(.+)/i
? ($1=~m/SOAPACTION/)
?('SOAPAction')
:($1)
: $_
) => $ENV{$_}
} keys %ENV),
$content,
);
# we copy the response message around here.
# Passing by reference would be much better...
my $response_message = eval { $self->SUPER::handle($request) };
# caveat: SOAP::WSDL::SOAP::Typelib::Fault11 is false in bool context...
if ($@ || blessed $@) {
$response = HTTP::Response->new(500);
if (blessed $@) {
$response->content( $self->get_serializer->serialize({
body =>$@
})
);
}
else {
$response->content($@);
}
}
else {
$response = HTTP::Response->new(200);
$response->header(
'Content-type' => 'text/xml; charset="utf-8"'
);
$response->content( $response_message );
}
$self->_output($response);
return;
}
sub _output :PRIVATE {
my ($self, $response) = @_;
# imitate nph- cgi for IIS (pointed by Murray Nesbitt)
my $status = defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/
? $ENV{SERVER_PROTOCOL} || 'HTTP/1.0'
: 'Status:';
my $code = $response->code;
binmode(STDOUT);
print STDOUT "$status $code ", HTTP::Status::status_message($code)
, "\015\012", $response->headers_as_string("\015\012")
, "\015\012", $response->content;
}
1;
=pod
=head1 NAME
SOAP::WSDL::Server::CGI - CGI based SOAP server
=head1 SYNOPSIS
=head1 DESCRIPTION
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under the same
terms as perl itself
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$LastChangedBy: kutterma $
$Id: Client.pm 391 2007-11-17 21:56:13Z kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
=cut
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::Service;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
my %port_of :ATTR(:name<port> :default<()>);
+5 -4
View File
@@ -20,9 +20,10 @@ sub send_receive {
@parameters{qw(envelope action endpoint encoding content_type)};
$encoding = defined($encoding)
? 'utf8'
: lc($encoding);
? lc($encoding)
: 'utf8';
$content_type = 'text/xml' if not defined($content_type);
# what's this all about?
# unfortunately combination of LWP and Perl 5.6.1 and later has bug
# in sending multibyte characters. LWP uses length() to calculate
@@ -87,9 +88,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 399 $
$LastChangedBy: kutterma $
$Id: HTTP.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: HTTP.pm 399 2007-11-19 19:20:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Transport/HTTP.pm $
=cut
+5 -11
View File
@@ -1,10 +1,10 @@
package SOAP::WSDL::Transport::Loopback;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'basic';
use SOAP::WSDL::Factory::Transport;
our $VERSION = '2.00_17';
our $VERSION=q{2.00_25};
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
SOAP::WSDL::Factory::Transport->register( https => __PACKAGE__ );
@@ -14,15 +14,6 @@ my %status_of :ATTR(:name<status> :default<()>);
my %message_of :ATTR(:name<message> :default<()>);
my %is_success_of :ATTR(:name<is_success> :default<()>);
{
no warnings qw(redefine);
sub new {
my $class = shift;
return bless \my ($o), $class;
}
}
# create methods normally inherited from SOAP::Client
SUBFACTORY: {
no strict qw(refs);
@@ -36,6 +27,9 @@ sub send_receive {
return $parameters{envelope};
}
Class::Std::initialize();
1;
=head1 NAME
+2 -2
View File
@@ -1,10 +1,10 @@
package SOAP::WSDL::Transport::Test;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use SOAP::WSDL::Factory::Transport;
our $VERSION = '2.00_14';
our $VERSION=q{2.00_25};
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
SOAP::WSDL::Factory::Transport->register( https => __PACKAGE__ );
+1 -2
View File
@@ -2,10 +2,9 @@ package SOAP::WSDL::Types;
use strict;
use warnings;
use SOAP::WSDL::XSD::Schema::Builtin;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
my %schema_of :ATTR(:name<schema> :default<[]>);
sub START {
+3 -2
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::XSD::Builtin;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
sub serialize {
@@ -14,7 +14,8 @@ sub serialize {
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
if ( $opt->{ autotype }) {
my $ns = $self->get_targetNamespace();
my $prefix = $opt->{ namespace }->{ $ns }
my %prefix_of = reverse %{ $opt->{ namespace } };
my $prefix = $prefix_of{ $ns }
|| die 'No prefix found for namespace '. $ns;
$xml .= ' type="' . $prefix . ':'
. $self->get_name() . '"' if ($self->get_name() );
+5 -3
View File
@@ -2,11 +2,11 @@ package SOAP::WSDL::XSD::ComplexType;
use strict;
use warnings;
use Carp;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw/SOAP::WSDL::Base/;
our $VERSION='2.00_17';
our $VERSION=q{2.00_25};
my %annotation_of :ATTR(:name<annotation> :default<()>);
my %element_of :ATTR(:name<element> :default<()>);
@@ -78,7 +78,9 @@ sub serialize {
if ( $opt->{ autotype }) {
my $ns = $self->get_targetNamespace();
my $prefix = $opt->{ namespace }->{ $ns }
# reverse namespace by prefix hash
my %prefix_of = reverse %{ $opt->{ namespace } };
my $prefix = $prefix_of{ $ns }
|| die 'No prefix found for namespace '. $ns;
$xml .= join q{}, " type=\"$prefix:", $self->get_name(), '" '
if ($self->get_name() );
+3 -3
View File
@@ -1,10 +1,10 @@
package SOAP::WSDL::XSD::Element;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
our $VERSION='2.00_22';
our $VERSION=q{2.00_25};
my %annotation_of :ATTR(:name<annotation> :default<()>);
my %simpleType_of :ATTR(:name<simpleType> :default<()>);
@@ -42,7 +42,7 @@ sub serialize {
my ($self, $name, $value, $opt) = @_;
my $type;
my $typelib = $opt->{ typelib };
my %ns_map = reverse %{ $opt->{ namespace } };
my %ns_map = %{ $opt->{ namespace } };
my $ident = ident $self;
# abstract elements may only be serialized via ref - and then we have a
+3 -1
View File
@@ -1,9 +1,11 @@
package SOAP::WSDL::XSD::Schema;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
our $VERSION=q{2.00_25};
# child elements
my %type_of :ATTR(:name<type> :default<[]>);
my %element_of :ATTR(:name<element> :default<[]>);
+3 -3
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::XSD::Schema::Builtin;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use SOAP::WSDL::XSD::Schema;
use SOAP::WSDL::XSD::Builtin;
use base qw(SOAP::WSDL::XSD::Schema);
@@ -88,9 +88,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 412 $
$LastChangedBy: kutterma $
$Id: Builtin.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: Builtin.pm 412 2007-11-27 22:57:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Schema/Builtin.pm $
=cut
+5 -3
View File
@@ -1,10 +1,10 @@
package SOAP::WSDL::XSD::SimpleType;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
our $VERSION='2.00_17';
our $VERSION=q{2.00_25};
my %annotation_of :ATTR(:name<annotation> :default<()>);
my %base_of :ATTR(:name<base> :default<()>);
@@ -84,8 +84,10 @@ sub _serialize_single {
$xml .= $opt->{ indent } if ($opt->{ readable }); # add indentation
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
if ( $opt->{ autotype }) {
# reverse namespace by prefix hash
my %prefix_of = reverse %{ $opt->{ namespace } };
my $ns = $self->get_targetNamespace();
my $prefix = $opt->{ namespace }->{ $ns }
my $prefix = $prefix_of{ $ns }
|| die 'No prefix found for namespace '. $ns;
$xml .= ' type="' . $prefix . ':' . $self->get_name() .'"';
}
+3 -3
View File
@@ -1,9 +1,9 @@
package SOAP::WSDL::XSD::Typelib::Builtin;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
our $VERSION="2.00_17";
our $VERSION=q{2.00_25};
use SOAP::WSDL::XSD::Typelib::Builtin::anyType;
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
@@ -393,7 +393,7 @@ when calling set_calue, but calls it over and over again...
=item * Thread safety
SOAP::WSDL::XSD::Typelib::Builtin uses Class::Std::Storable which uses
SOAP::WSDL::XSD::Typelib::Builtin uses Class::Std::Fast::Storable which uses
Class::Std. Class::Std is not thread safe, so
SOAP::WSDL::XSD::Typelib::Builtin is neither.
+3 -21
View File
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::ENTITY;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::NCName);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::NCName);
Class::Std::initialize();
1;
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::ID;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::NCName);
1;
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::IDREF;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::ID);
1;
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::IDREFS;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::list
SOAP::WSDL::XSD::Typelib::Builtin::IDREF);
+3 -21
View File
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::NCName;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::Name);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::Name);
Class::Std::initialize();
1;
+2 -21
View File
@@ -1,26 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::token);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::token);
1;
+2 -20
View File
@@ -1,26 +1,8 @@
package SOAP::WSDL::XSD::Typelib::Builtin::NMTOKENS;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::list
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::list
SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
1;
+2 -21
View File
@@ -1,26 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::NOTATION;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
+3 -21
View File
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::Name;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::token);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::token);
Class::Std::initialize();
1;
+2 -21
View File
@@ -1,27 +1,8 @@
package SOAP::WSDL::XSD::Typelib::Builtin::QName;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
@@ -1,17 +1,17 @@
package SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
use strict;
use warnings;
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
my %value_of :ATTR(:get<value> :init_arg<value> :default<()>);
# don't you never dare to play with this !
our $___value = \%value_of;
## use $_[n] for speed - we get called zillions of times...
# and we don't need to return the last value...
sub set_value { $value_of{ ident $_[0] } = $_[1] }
sub set_value { $value_of{ ${ $_[0] } } = $_[1] }
# use $_[n] for speed.
# This is less readable, but notably faster.
@@ -24,19 +24,33 @@ sub set_value { $value_of{ ident $_[0] } = $_[1] }
sub serialize {
no warnings qw(uninitialized);
my $ident = ident $_[0];
$_[1]->{ nil } = 1 if not defined $value_of{ $ident };
$_[1]->{ nil } = 1 if not defined $value_of{ ${$_[0]} };
return join q{}
, $_[0]->start_tag($_[1], $value_of{ $ident })
, $value_of{ $ident }
, $_[0]->start_tag($_[1], $value_of{ ${$_[0]} })
, $value_of{ ${$_[0]} }
, $_[0]->end_tag($_[1]);
}
sub as_bool :BOOLIFY {
return $value_of { ident $_[0] };
sub as_string :STRINGIFY {
return $value_of { ${ $_[0] } };
}
Class::Std::initialize(); # make :BOOLIFY overloading serializable
sub as_bool :BOOLIFY {
return $value_of { ${ $_[0] } };
}
my $ID_GENERATOR_REF = Class::Std::Fast::ID_GENERATOR_REF();
my $OBJECT_CACHE_REF = Class::Std::Fast::OBJECT_CACHE_REF();
sub new {
my $self = pop @{ $OBJECT_CACHE_REF->{ $_[0] } };
$self = bless \(my $o = Class::Std::Fast::ID()), $_[0]
if not defined $self;
$value_of{ $$self } = $_[1]->{ value }
if (($#_) && exists $_[1]->{ value });
return $self;
}
Class::Std::Fast::initialize(); # make :BOOLIFY overloading serializable
1;
+1 -1
View File
@@ -1,7 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::anyType;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
sub get_xmlns { 'http://www.w3.org/2001/XMLSchema' };
+2 -19
View File
@@ -2,24 +2,7 @@ package SOAP::WSDL::XSD::Typelib::Builtin::anyURI;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
@@ -2,36 +2,8 @@ package SOAP::WSDL::XSD::Typelib::Builtin::base64Binary;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
# XML Schema facets. We don't know how to implement them yet, but they're
# here, just in case you wanted to know.
#my %length_of :ATTR(:name<length> :default<()>);
#my %minLength_of :ATTR(:name<minLength> :default<()>);
#my %maxLength_of :ATTR(:name<maxLength> :default<()>);
#my %pattern_of :ATTR(:name<pattern> :default<()>);
#my %enumeration_of :ATTR(:name<enumeration> :default<()>);
#my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
+23 -38
View File
@@ -1,58 +1,43 @@
package SOAP::WSDL::XSD::Typelib::Builtin::boolean;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
our $VERSION='2.00_17';
our $VERSION='2.00_23';
my %value_of :ATTR(:get<value> :init_attr<value> :default<()>);
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
# use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
sub serialize {
my ($self, $opt) = @_;
my $ident = ident $self;
$opt ||= {};
return $self->start_tag({ %$opt, nil => 1})
if not defined $value_of{ $ident };
$_[1] ||= {};
my $value =$_[0]->get_value();
return $_[0]->start_tag({ %{$_[1]}, nil => 1})
if not defined $value;
return join q{}
, $self->start_tag($opt)
, $value_of{ $ident } ? 'true' : 'false'
, $self->end_tag($opt);
, $_[0]->start_tag($_[1])
, $value && $value ne 'false' ? 'true' : 'false'
, $_[0]->end_tag($_[1]);
}
sub as_string :STRINGIFY {
my $value = $_[0]->get_value();
return q{} if not defined $value;
return ($value && $value ne 'false') ? 1 : 0;
}
sub as_num :NUMERIFY :BOOLIFY {
return $_[0]->get_value();
my $value = $_[0]->get_value();
return ($value && $value ne 'false') ? 1 : 0;
}
sub set_value {
my ($self, $value) = @_;
$value_of{ ident $self } = defined $value
? ($value ne 'false' && ($value) )
$_[0]->SUPER::set_value( defined $_[1]
? ($_[1] ne 'false' && ($_[1]) )
? 1 : 0
: 0;
: 0);
}
sub delete_value { undef $value_of{ ident $_[0] }; return }
sub delete_value { $_[0]->SUPER::set_value(undef) }
Class::Std::initialize(); # make :BOOLIFY overloading serializable
Class::Std::Fast::initialize(); # make :BOOLIFY overloading serializable
1;
+3 -22
View File
@@ -1,26 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::byte;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::short);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::short);
Class::Std::initialize();
1;
+2 -21
View File
@@ -1,30 +1,11 @@
package SOAP::WSDL::XSD::Typelib::Builtin::date;
use strict;
use warnings;
use Date::Parse;
use Date::Format;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
sub set_value {
# use set_value from base class if we have a XML-DateTime format
+4 -36
View File
@@ -1,47 +1,15 @@
package SOAP::WSDL::XSD::Typelib::Builtin::dateTime;
use strict;
use warnings;
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
use Date::Parse;
use Date::Format;
# XML Schema facets. We don't know how to implement them yet, but they're
# here, just in case you wanted to know.
#
#my %pattern_of :ATTR(:name<pattern> :default<()>);
#my %enumeration_of :ATTR(:name<enumeration> :default<()>);
#my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
#my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
#my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
#my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
#my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
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 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} )?
@@ -51,7 +19,7 @@ sub set_value {
# strptime sets empty values to undef - and strftime doesn't like that...
my @time_from = map { ! defined $_ ? 0 : $_ } strptime($_[1]);
return if not (@time_from);
undef $time_from[$#time_from];
my $time_str = strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from );
+3 -22
View File
@@ -1,32 +1,13 @@
package SOAP::WSDL::XSD::Typelib::Builtin::decimal;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
sub as_num :NUMERIFY :BOOLIFY {
return $_[0]->get_value();
}
Class::Std::initialize(); # make :NUMERIFY :BOOLIFY overloading serializable
Class::Std::Fast::initialize(); # make :NUMERIFY :BOOLIFY overloading serializable
1;
+2 -20
View File
@@ -1,26 +1,8 @@
package SOAP::WSDL::XSD::Typelib::Builtin::double;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
sub as_num :NUMERIFY {
return $_[0]->get_value();
+2 -20
View File
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::duration;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
+2 -21
View File
@@ -1,27 +1,8 @@
package SOAP::WSDL::XSD::Typelib::Builtin::float;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
sub as_num :NUMERIFY {
return $_[0]->get_value();
+2 -21
View File
@@ -1,26 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::gDay;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
+2 -19
View File
@@ -3,24 +3,7 @@ use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
+2 -21
View File
@@ -1,26 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
+2 -21
View File
@@ -1,26 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::gYear;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
+2 -20
View File
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::hexBinary;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
1;
+2 -21
View File
@@ -1,26 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::int;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::long);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::long);
1;
+2 -27
View File
@@ -1,32 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::integer;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::decimal);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
sub as_num :NUMERIFY {
return $_[0]->get_value();
}
Class::Std::initialize(); # make :NUMERIFY overloading serializable
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::decimal);
1;
+2 -21
View File
@@ -1,26 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::language;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::token);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::token);
1;
+1 -1
View File
@@ -1,10 +1,10 @@
package SOAP::WSDL::XSD::Typelib::Builtin::list;
use strict;
use warnings;
use Class::Std::Storable;
sub serialize {
my ($self, $opt) = @_;
$opt = {} if not $opt;
my $value = $self->get_value();
return $self->start_tag({ %$opt, nil => 1 }) if not defined $value;
$value = [ $value ] if not ref $value;
+2 -20
View File
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::long;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::integer);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::integer);
1;
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger);
1;
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::integer);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::integer);
1;
@@ -1,26 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::integer);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::integer);
1;
@@ -1,33 +1,14 @@
package SOAP::WSDL::XSD::Typelib::Builtin::normalizedString;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::string);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
};
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::string);
# replace all \t, \r, \n by \s
sub set_value {
my $value = $_[1];
$value =~ s{ [\r\n\t] }{ }xmsg if defined($value);
$value =~ s{ [\r\n\t]+ }{ }xmsg if defined($value);
$_[0]->SUPER::set_value($value);
}
Class::Std::initialize();
1;
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger);
1;
+2 -20
View File
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::short;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::int);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::int);
1;
+15 -29
View File
@@ -1,51 +1,37 @@
package SOAP::WSDL::XSD::Typelib::Builtin::string;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
my %char2entity = (
q{&} => q{&amp;},
q{<} => q{&lt;},
q{>} => q{&gt;},
q{"} => q{&qout;},
q{"} => q{&quot;},
q{'} => q{&apos;},
);
sub serialize {
my ($self, $opt) = @_;
my $ident = ident $self;
$opt ||= {};
my $value = $self->get_value();
return $self->start_tag({ %{ $opt }, nil => 1})
$_[1] ||= {};
my $value = $_[0]->get_value();
return $_[0]->start_tag({ %{ $_[1] }, nil => 1})
if not defined $value;
# HTML::Entities does the same - and more, thus it's around 1/3 slower...
$value =~ s{([&<>"'])}{$char2entity{$1}}xgmso;
return join q{}, $self->start_tag($opt, $value)
return join q{}, $_[0]->start_tag($_[1], $value)
#, encode_entities( $value, q{&<>"'} )
, $value
, $self->end_tag($opt);
, $_[0]->end_tag($_[1]);
}
sub as_bool :BOOLIFY {
return $_[0]->get_value();
}
Class::Std::initialize;
1;
+3 -22
View File
@@ -3,28 +3,10 @@ use strict;
use warnings;
use Date::Parse;
use Date::Format;
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
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;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
our $VERSION='2.00_25';
sub set_value {
# use set_value from base class if we have a XML-Time format
@@ -59,5 +41,4 @@ sub set_value {
}
}
1;
+3 -20
View File
@@ -1,24 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::token;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::normalizedString);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::normalizedString);
Class::Std::initialize();
1;
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort);
1;
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong);
1;
@@ -1,24 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger);
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
1;
@@ -1,25 +1,7 @@
package SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort;
use strict;
use warnings;
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
BEGIN {
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt);
no warnings qw(redefine);
no strict qw(refs);
# Yes, I know it's ugly - but this is the fastest constructor to write
# for Class::Std-Style inside out objects..
*{ __PACKAGE__ . '::new' } = sub {
my $self = bless \do { my $foo } , shift;
if (@_) {
$self->set_value( $_[0]->{ value } )
if exists $_[0]->{ value }
}
return $self;
};
}
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt);
1;
+20 -17
View File
@@ -5,17 +5,20 @@ use warnings;
use Carp;
use SOAP::WSDL::XSD::Typelib::Builtin;
use Scalar::Util qw(blessed refaddr);
use Class::Std::Storable;
require Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
our $VERSION = '2.00_24';
our $VERSION = '2.00_25';
my %ELEMENTS_FROM;
my %ATTRIBUTES_OF;
my %CLASSES_OF;
# STORABLE_ methods for supporting Class::Std::Storable.
# don't you ever dare to use this !
our $___attributes_of_ref = \%ATTRIBUTES_OF;
# STORABLE_ methods for supporting Class::Std::Fast::Storable.
# We could also handle them via AUTOMETHOD,
# but AUTOMETHOD should always croak...
# Do we really need this ?
@@ -46,6 +49,7 @@ sub _factory {
no strict qw(refs);
no warnings qw(redefine);
while (my ($name, $attribute_ref) = each %{ $ATTRIBUTES_OF{ $class } } ) {
my $type = $CLASSES_OF{ $class }->{ $name }
or croak "No class given for $name";
@@ -97,7 +101,7 @@ sub _factory {
*{ "$class\::set_$name" } = sub {
my $is_ref = ref $_[1];
$attribute_ref->{ ident $_[0] } = ($is_ref)
$attribute_ref->{ ${ $_[0] } } = ($is_ref)
? ($is_ref eq 'ARRAY')
? $is_list # remembered from outside closure
? $type->new({ value => $_[1] }) # it's a list element - can take list ref as value
@@ -125,25 +129,24 @@ sub _factory {
};
*{ "$class\::add_$name" } = sub {
my $ident = ident $_[0];
warn "attempting to add empty value to " . ref $_[0]
if not defined $_[1];
# first call
# test for existance, not for definedness
if (not exists $attribute_ref->{ $ident }) {
$attribute_ref->{ $ident } = $_[1];
if (not exists $attribute_ref->{ ${ $_[0]} }) {
$attribute_ref->{ ${ $_[0]} } = $_[1];
return;
}
if (not ref $attribute_ref->{ $ident } eq 'ARRAY') {
if (not ref $attribute_ref->{ ${ $_[0]} } eq 'ARRAY') {
# second call: listify previous value if it's no list and add current
$attribute_ref->{ $ident } = [ $attribute_ref->{ $ident }, $_[1] ];
$attribute_ref->{ ${ $_[0]} } = [ $attribute_ref->{ ${ $_[0]} }, $_[1] ];
return;
}
# second and following: add to list
push @{ $attribute_ref->{ $ident } }, $_[1];
push @{ $attribute_ref->{ ${ $_[0]} } }, $_[1];
return;
};
@@ -155,7 +158,7 @@ sub _factory {
# TODO Could be moved as normal method into base class, e.g. here.
# Hmm. let's see...
*{ "$class\::new" } = sub {
my $self = bless \my ($o), $_[0];
my $self = bless \(my $o = Class::Std::Fast::ID()), $_[0];
# We're working on @_ for speed.
# Normally, the first line would look like this:
# my ($self, $ident, $args_of) = @_;
@@ -187,7 +190,7 @@ sub _factory {
# <restriction><sequence>.
# But what about choice, extension ?
*{ "$class\::_serialize" } = sub {
my $ident = ident $_[0];
my $ident = ${ $_[0]};
# return concatenated return value of serialize call of all
# elements retrieved from get_elements expanding list refs.
# get_elements is inlined for performance.
@@ -248,7 +251,7 @@ SOAP::WSDL::XSD::Typelib::ComplexType - Base class for complexType node classes
To subclass, write a package like this:
package MyComplexType;
use Class::Std::Storable
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
# we only need the :get attribute qualifier.
@@ -365,9 +368,9 @@ Variants known to work are:
=item * Thread safety
SOAP::WSDL::XSD::Typelib::Builtin uses Class::Std::Storable which uses
SOAP::WSDL::XSD::Typelib::Builtin::ComplexType uses Class::Std::Fast::Storable which uses
Class::Std. Class::Std is not thread safe, so
SOAP::WSDL::XSD::Typelib::Builtin is neither.
SOAP::WSDL::XSD::Typelib::Builtin::ComplexType is neither.
=item * XML Schema facets
@@ -388,9 +391,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 412 $
$LastChangedBy: kutterma $
$Id: ComplexType.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: ComplexType.pm 412 2007-11-27 22:57:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $
=cut
+3 -3
View File
@@ -2,7 +2,7 @@
package SOAP::WSDL::XSD::Typelib::Element;
use strict;
our $VERSION = '2.00_24';
our $VERSION=q{2.00_25};
my %NAME;
my %NILLABLE;
@@ -93,7 +93,7 @@ This example creates a class for this XML schema definition:
package MyElement;
use strict;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base (
'SOAP::WSDL::XSD::Typelib::Element',
'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -111,7 +111,7 @@ Now we create this XML schema definition type class:
package MyElement2;
use strict;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base (
'SOAP::WSDL::XSD::Typelib::Element',
'MyElement'
+3 -5
View File
@@ -1,12 +1,10 @@
#!/usr/bin/perl
package SOAP::WSDL::XSD::Typelib::SimpleType;
use strict;
use Class::Std::Storable;
use SOAP::WSDL::XSD::Typelib::Builtin;
package SOAP::WSDL::XSD::Typelib::SimpleType::restriction;
use strict;
use Class::Std::Storable;
use SOAP::WSDL::XSD::Typelib::Builtin;
use base qw(SOAP::WSDL::XSD::Typelib::SimpleType);
@@ -32,7 +30,7 @@ modelling XML Schema simpleType definitions.
# <restriction base="xsd:string" />
# </simpleType>
package MySimpleType;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
# restriction base implemented via inheritance
use SOAP::WSDL::XSD::Typelib::Builtin;
use SOAP::WSDL::XSD::Typelib::SimpleType;
@@ -49,7 +47,7 @@ modelling XML Schema simpleType definitions.
# <list itemTipe="xsd:string" />
# </simpleType>
package MySimpleListType;
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
# restriction base implemented via inheritance
use SOAP::WSDL::XSD::Typelib::Builtin;
use base ('SOAP::WSDL::XSD::Typelib::SimpleType',
@@ -104,7 +102,7 @@ complexType definitions.
=item * Thread safety
SOAP::WSDL::XSD::Typelib::SimpleType uses Class::Std::Storable which uses
SOAP::WSDL::XSD::Typelib::SimpleType uses Class::Std::Fast::Storable which uses
Class::Std. Class::Std is not thread safe, so
SOAP::WSDL::XSD::Typelib::SimpleType is neither.