File Coverage

blib/lib/SOAP/WSDL/Deserializer/XSD.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             package SOAP::WSDL::Deserializer::XSD;
2 3     3   149055 use strict;
  3         7  
  3         113  
3 3     3   15 use warnings;
  3         5  
  3         90  
4 3     3   1538 use Class::Std::Fast::Storable;
  3         46352  
  3         27  
5 3     3   2240 use SOAP::WSDL::SOAP::Typelib::Fault11;
  0            
  0            
6             use SOAP::WSDL::Expat::MessageParser;
7              
8             use version; our $VERSION = qv('3.001');
9              
10             my %class_resolver_of :ATTR(:name :default<()>);
11             my %strict_of :ATTR(:get :init_arg :default<1>);
12             my %parser_of :ATTR();
13              
14             sub set_strict {
15             undef $parser_of{${$_[0]}};
16             $strict_of{${$_[0]}} = $_[1];
17             }
18              
19             sub BUILD {
20             my ($self, $ident, $args_of_ref) = @_;
21              
22             # ignore all options except 'class_resolver'
23             for (keys %{ $args_of_ref }) {
24             next if $_ eq 'strict';
25             next if $_ eq 'class_resolver';
26             delete $args_of_ref->{ $_ };
27             }
28             }
29              
30             sub deserialize {
31             my ($self, $content) = @_;
32              
33             $parser_of{ ${ $self } } = SOAP::WSDL::Expat::MessageParser->new({
34             strict => $strict_of{ ${ $self } }
35             })
36             if not $parser_of{ ${ $self } };
37             $parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ${ $self } } );
38             $content =~ s{^<\?xml version="1.0" *\?>}{}; # XML::Parser::Expat apparently doesn't like this.
39             eval { $parser_of{ ${ $self } }->parse_string( $content ) };
40             if ($@) {
41             return $self->generate_fault({
42             code => 'SOAP-ENV:Server',
43             role => 'urn:localhost',
44             message => "Error deserializing message: $@. \n"
45             . "Message was: \n$content"
46             });
47             }
48             return ( $parser_of{ ${ $self } }->get_data(), $parser_of{ ${ $self } }->get_header() );
49             }
50              
51             sub generate_fault {
52             my ($self, $args_from_ref) = @_;
53             return SOAP::WSDL::SOAP::Typelib::Fault11->new({
54             faultcode => $args_from_ref->{ code } || 'SOAP-ENV:Client',
55             faultactor => $args_from_ref->{ role } || 'urn:localhost',
56             faultstring => $args_from_ref->{ message } || "Unknown error"
57             });
58             }
59              
60             1;
61              
62             __END__