File: Hash.pm

package info (click to toggle)
libsoap-wsdl-perl 3.004-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 2,600 kB
  • sloc: perl: 8,433; xml: 1,769; java: 19; makefile: 15
file content (171 lines) | stat: -rw-r--r-- 3,651 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package SOAP::WSDL::Deserializer::Hash;
use strict;
use warnings;
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 = 3.004;

sub BUILD {
    my ($self, $ident, $args_of_ref) = @_;

    # ignore all options
    for (keys %{ $args_of_ref }) {
        delete $args_of_ref->{ $_ }
    }
}

sub deserialize {
    my ($self, $content) = @_;

    my $parser = SOAP::WSDL::Expat::Message2Hash->new();
    eval { $parser->parse_string( $content ) };
    if ($@) {
        die $self->generate_fault({
            code => 'soap:Server',
            role => 'urn:localhost',
            message => "Error deserializing message: $@. \n"
                . "Message was: \n$content"
        });
    }
    return $parser->get_data();
}

sub generate_fault {
    my ($self, $args_from_ref) = @_;
    return SOAP::WSDL::SOAP::Typelib::Fault11->new({
            faultcode => $args_from_ref->{ code } || 'SOAP-ENV:Client',
            faultactor => $args_from_ref->{ role } || 'urn:localhost',
            faultstring => $args_from_ref->{ message } || "Unknown error"
    });
}

1;

=head1 NAME

SOAP::WSDL::Deserializer::Hash - Deserializer SOAP messages into perl hash refs

=head1 SYNOPSIS

 use SOAP::WSDL;
 use SOAP::WSDL::Deserializer::Hash;

=head1 DESCRIPTION

Deserializer for creating perl hash refs as result of a SOAP call.

=head2 Output structure

The XML structure is converted into a perl data structure consisting of
hash and or list references. List references are used for holding array data.

SOAP::WSDL::Deserializer::Hash creates list references always at the maximum
depth possible.

Examples:

 XML:
 <MyDataArray>
    <MyData>1</MyData>
    <MyData>1</MyData>
 </MyDataArray>

 Perl:
 {
     MyDataArray => {
         MyData => [ 1, 1 ]
     }
 }

 XML:
 <DeepArray>
    <MyData><int>1<int>/MyData>
    <MyData><int>1<int>/MyData>
 </DeepArray>

 Perl:
 {
     MyDataArray => {
         MyData => [
            { int => 1 },
            { int => 1 }
         ]
     }
 }

List reference creation is triggered by the second occurrence of an element.
XML Array types with one element only will not be represented as list
references.

=head1 USAGE

All you need to do is to use SOAP::WSDL::Deserializer::Hash.

SOAP::WSDL::Deserializer::Hash autoregisters itself for SOAP1.1 messages

You may register SOAP::WSDLDeserializer::Hash for other SOAP Versions by
calling

 SOAP::Factory::Deserializer->register('1.2',
    SOAP::WSDL::Deserializer::Hash)

=head1 Limitations

=over

=item * Namespaces

All namespaces are ignored.

=item * XML attributes

All XML attributes are ignored.

=back

=head2 Differences from other SOAP::WSDL::Deserializer classes

=over

=item * generate_fault

SOAP::WSDL::Deserializer::Hash will die with a SOAP::WSDL::Fault11 object when
a parse error appears

=back

=head1 METHODS

=head2 deserialize

Deserializes the message.

=head2 generate_fault

Generates a L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
object and returns it.

=head1 LICENSE AND COPYRIGHT

Copyright 2004-2008 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: 851 $
 $LastChangedBy: kutterma $
 $Id: Hash.pm 851 2009-05-15 22:45:18Z kutterma $
 $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $

=cut