File Coverage

lib/XML/Compile/RPC.pm
Criterion Covered Total %
statement 12 12 100.0
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 16 16 100.0


line stmt bran cond sub pod time code
1             # Copyrights 2009-2013 by [Mark Overmeer].
2             # For other contributors see ChangeLog.
3             # See the manual pages for details on the licensing terms.
4             # Pod stripped from pm file by OODoc 2.01.
5 4     4   208692 use warnings;
  4         8  
  4         116  
6 4     4   19 use strict;
  4         9  
  4         137  
7              
8             package XML::Compile::RPC;
9 4     4   28 use vars '$VERSION';
  4         7  
  4         180  
10             $VERSION = '0.17';
11              
12 4     4   22 use base 'XML::Compile::Cache';
  4         6  
  4         15036  
13              
14             use Log::Report 'xml-compile-rpc', syntax => 'SHORT';
15              
16              
17             sub init($)
18             { my ($self, $args) = @_;
19              
20             push @{$args->{opts_rw}}, sloppy_floats => 1, sloppy_integers => 1
21             , mixed_elements => 'STRUCTURAL';
22              
23             push @{$args->{opts_readers}}
24             , hooks => [ {type => 'ValueType', replace => \&_rewrite_string}
25             , {type => 'ISO8601', replace => \&_reader_rewrite_date} ];
26              
27             push @{$args->{opts_writers}}
28             , hook => {type => 'ISO8601', before => \&_writer_rewrite_date};
29              
30             $self->SUPER::init($args);
31              
32             (my $xsd = __FILE__) =~ s,\.pm$,/xml-rpc.xsd,;
33             $self->importDefinitions($xsd);
34              
35             # only declared methods are accepted by the Cache
36             $self->declare(WRITER => 'methodCall');
37             $self->declare(READER => 'methodResponse');
38             $self;
39             }
40              
41             sub _rewrite_string($$$$$)
42             { my ($element, $reader, $path, $type, $replaced) = @_;
43             # panic $element->childNodes;
44              
45             (grep $_->isa('XML::LibXML::Element'), $element->childNodes)
46             ? $replaced->($element)
47             : (value => {string => $element->textContent});
48             }
49              
50             # xsd:dateTime requires - and : between the components
51             sub _iso8601_to_dateTime($)
52             { my $s = shift;
53             $s =~ s/^([12][0-9][0-9][0-9])-?([01][0-9])-?([0-3][0-9])T/$1-$2-$3T/;
54             $s =~ s/T([012][0-9]):?([0-5][0-9]):?([0-6][0-9])/T$1:$2:$3/;
55             $s;
56             }
57              
58             sub _writer_rewrite_date
59             { my ($doc, $string, $path) = @_;
60             _iso8601_to_dateTime $string;
61             }
62              
63             sub _reader_rewrite_date
64             { my ($element, $reader, $path, $type, $replaced) = @_;
65             my $schema_time = _iso8601_to_dateTime $element->textContent;
66             # $schema_time should get validated...
67             ('dateTime.iso8601' => $schema_time);
68             }
69              
70             1;