line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Config::Constants::XML::SAX::Handler; |
2
|
|
|
|
|
|
|
|
3
|
9
|
|
|
9
|
|
59
|
use strict; |
|
9
|
|
|
|
|
67
|
|
|
9
|
|
|
|
|
395
|
|
4
|
9
|
|
|
9
|
|
47
|
use warnings; |
|
9
|
|
|
|
|
14
|
|
|
9
|
|
|
|
|
393
|
|
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
our $VERSION = '0.03'; |
7
|
|
|
|
|
|
|
|
8
|
9
|
|
|
9
|
|
45
|
use constant MAX_INCLUDE_DEPTH => 5; |
|
9
|
|
|
|
|
14
|
|
|
9
|
|
|
|
|
1385
|
|
9
|
|
|
|
|
|
|
|
10
|
9
|
|
|
9
|
|
68
|
use base 'XML::SAX::Base'; |
|
9
|
|
|
|
|
15
|
|
|
9
|
|
|
|
|
15682
|
|
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
sub new { |
13
|
8
|
|
|
8
|
1
|
21
|
my $class = shift; |
14
|
8
|
|
|
|
|
81
|
my $self = $class->SUPER::new(@_); |
15
|
8
|
|
|
|
|
737
|
$self->{_config} = undef; |
16
|
8
|
|
|
|
|
20
|
$self->{_current_module} = undef; |
17
|
8
|
|
|
|
|
53
|
$self->{_current_constant} = undef; |
18
|
8
|
|
|
|
|
17
|
$self->{_constant_deferred} = 0; |
19
|
8
|
|
|
|
|
18
|
$self->{_expected_type} = undef; |
20
|
8
|
|
|
|
|
21
|
$self->{_current_text} = undef; |
21
|
8
|
|
|
|
|
17
|
$self->{_include_depth} = 0; |
22
|
8
|
|
|
|
|
27
|
return $self; |
23
|
|
|
|
|
|
|
} |
24
|
|
|
|
|
|
|
|
25
|
7
|
|
|
7
|
1
|
376
|
sub config { (shift)->{_config} } |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
sub start_element { |
28
|
56
|
|
|
56
|
1
|
55356
|
my ($self, $el) = @_; |
29
|
56
|
|
|
|
|
432
|
my $tag_name = lc($el->{Name}); |
30
|
56
|
100
|
|
|
|
242
|
if ($tag_name eq 'config') { |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
31
|
15
|
100
|
|
|
|
96
|
$self->{_config} = {} unless $self->{_config}; |
32
|
|
|
|
|
|
|
} |
33
|
|
|
|
|
|
|
elsif ($tag_name eq 'include') { |
34
|
8
|
|
|
|
|
26
|
my $path = $self->_get_value($el, 'path'); |
35
|
8
|
50
|
|
|
|
169
|
(-e $path) |
36
|
|
|
|
|
|
|
|| die "Cannot find include file at '$path'"; |
37
|
8
|
100
|
|
|
|
308
|
($self->{_include_depth} < $self->MAX_INCLUDE_DEPTH) |
38
|
|
|
|
|
|
|
|| die "You have reached the max include depth"; |
39
|
7
|
|
|
|
|
24
|
$self->{_include_depth}++; |
40
|
7
|
|
|
|
|
58
|
my $p = XML::SAX::ParserFactory->parser(Handler => $self); |
41
|
7
|
|
|
|
|
3033
|
$p->parse_uri($path); |
42
|
|
|
|
|
|
|
} |
43
|
|
|
|
|
|
|
elsif ($tag_name eq 'module') { |
44
|
14
|
|
|
|
|
275
|
$self->{_current_module} = $self->_get_value($el, 'name'); |
45
|
14
|
100
|
|
|
|
108
|
$self->{_config}->{$self->{_current_module}} = {} |
46
|
|
|
|
|
|
|
unless exists $self->{_config}->{$self->{_current_module}}; |
47
|
|
|
|
|
|
|
} |
48
|
|
|
|
|
|
|
elsif ($tag_name eq 'constant') { |
49
|
19
|
|
|
|
|
49
|
$self->{_current_constant} = $self->_get_value($el, 'name'); |
50
|
19
|
100
|
|
|
|
58
|
if (defined($self->_get_value($el, 'value'))) { |
51
|
16
|
|
|
|
|
35
|
$self->{_config} |
52
|
|
|
|
|
|
|
->{$self->{_current_module}} |
53
|
|
|
|
|
|
|
->{$self->{_current_constant}} = $self->_get_value($el, 'value') |
54
|
|
|
|
|
|
|
} |
55
|
|
|
|
|
|
|
else { |
56
|
3
|
|
|
|
|
6
|
$self->{_expected_type} = $self->_get_value($el, 'type'); |
57
|
3
|
|
|
|
|
10
|
$self->{_constant_deferred} = 1; |
58
|
|
|
|
|
|
|
} |
59
|
|
|
|
|
|
|
} |
60
|
|
|
|
|
|
|
else { |
61
|
0
|
|
|
|
|
0
|
die "did not recognize the tag: $tag_name"; |
62
|
|
|
|
|
|
|
} |
63
|
|
|
|
|
|
|
} |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
sub end_element { |
66
|
44
|
|
|
44
|
1
|
4530
|
my ($self, $el) = @_; |
67
|
44
|
100
|
|
|
|
184
|
return unless lc($el->{Name}) eq 'constant'; |
68
|
19
|
100
|
|
|
|
86
|
return unless $self->{_constant_deferred}; |
69
|
3
|
50
|
|
|
|
8
|
($self->{_current_text}) |
70
|
|
|
|
|
|
|
|| die "We dont have anything to put into the constant '" . $self->{_current_constant} . "'"; |
71
|
3
|
|
|
|
|
13
|
$self->{_config} |
72
|
|
|
|
|
|
|
->{$self->{_current_module}} |
73
|
|
|
|
|
|
|
->{$self->{_current_constant}} = $self->{_current_text}; |
74
|
3
|
|
|
|
|
4
|
$self->{_current_text} = undef; |
75
|
3
|
|
|
|
|
9
|
$self->{_constant_deferred} = 0; |
76
|
|
|
|
|
|
|
} |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
sub characters { |
79
|
67
|
|
|
67
|
1
|
3779
|
my ($self, $el) = @_; |
80
|
67
|
|
|
|
|
156
|
my $data = $el->{Data}; |
81
|
67
|
100
|
|
|
|
421
|
return if $data =~ /^\s+$/; |
82
|
3
|
50
|
|
|
|
22
|
if ($self->{_expected_type}) { |
83
|
3
|
|
|
|
|
199
|
my $value = eval $data; |
84
|
3
|
50
|
|
|
|
11
|
die "eval of constant value failed: '$data' -> $@" if $@; |
85
|
3
|
50
|
|
|
|
16
|
(UNIVERSAL::isa($value, $self->{_expected_type})) |
86
|
|
|
|
|
|
|
|| die "constant did not eval into the type we expected ($data); got : '$value' - expected: '" . $self->{_expected_type}. "'"; |
87
|
3
|
|
|
|
|
12
|
$self->{_current_text} = $value; |
88
|
|
|
|
|
|
|
} |
89
|
|
|
|
|
|
|
else { |
90
|
|
|
|
|
|
|
# its just plain text |
91
|
0
|
|
|
|
|
0
|
$self->{_current_text} = $data; |
92
|
|
|
|
|
|
|
} |
93
|
|
|
|
|
|
|
} |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
sub _get_value { |
96
|
79
|
|
|
79
|
|
115
|
my ($self, $el, $key) = @_; |
97
|
79
|
100
|
|
|
|
237
|
return undef unless exists $el->{Attributes}->{'{}' . $key}; |
98
|
76
|
|
|
|
|
331
|
return $el->{Attributes}->{'{}' . $key}->{Value}; |
99
|
|
|
|
|
|
|
} |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
1; |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
__END__ |