1 use strict; use warnings;
2 package OpenSRF::Utils::SettingsParser;
3 use OpenSRF::Utils::Config;
4 use OpenSRF::EX qw(:try);
11 our $log = 'OpenSRF::Utils::Logger';
15 sub new { return bless({},shift()); }
18 # returns 0 if the config file could not be found or if there is a parse error
19 # returns 1 if successful
22 my ($self,$bootstrap_config) = @_;
23 return 0 unless($self and $bootstrap_config);
25 $parser = XML::LibXML->new();
26 $parser->keep_blanks(0);
28 $doc = $parser->parse_file( $bootstrap_config );
35 sub _get { _get_overlay(@_) }
38 my( $self, $xpath ) = @_;
39 my @nodes = $doc->documentElement->findnodes( $xpath );
41 my $base = XML2perl(shift(@nodes));
43 for my $node (@nodes) {
44 push @overlays, XML2perl($node);
47 for my $ol ( @overlays ) {
48 $base = merge_perl($base, $ol);
55 my( $self, $xpath ) = @_;
56 my @nodes = $doc->documentElement->findnodes( $xpath );
59 for my $node (@nodes) {
60 push @overlays, XML2perl($node);
71 if (ref($ol) eq 'HASH') {
72 for my $key (keys %$ol) {
73 if (ref($$ol{$key}) and ref($$ol{$key}) eq ref($$base{$key})) {
74 merge_perl($$base{$key}, $$ol{$key});
76 $$base{$key} = $$ol{$key};
80 for my $key (0 .. scalar(@$ol) - 1) {
81 if (ref($$ol[$key]) and ref($$ol[$key]) eq ref($$base[$key])) {
82 merge_perl($$base[$key], $$ol[$key]);
84 $$base[$key] = $$ol[$key];
97 return 0+$value if ($value =~ /^\d{1,10}$/o);
105 return undef unless($node);
107 for my $attr ( ($node->attributes()) ) {
109 $output{$attr->nodeName} = _check_for_int($attr->value);
112 my @kids = $node->childNodes;
113 if (@kids == 1 && $kids[0]->nodeType == 3) {
114 return _check_for_int($kids[0]->textContent);
116 for my $kid ( @kids ) {
117 next if ($kid->nodeName eq 'comment');
118 if (exists $output{$kid->nodeName}) {
119 if (ref $output{$kid->nodeName} ne 'ARRAY') {
120 $output{$kid->nodeName} = [$output{$kid->nodeName}, XML2perl($kid)];
122 push @{$output{$kid->nodeName}}, XML2perl($kid);
126 $output{$kid->nodeName} = XML2perl($kid);
134 # returns the full config hash for a given server
135 sub get_server_config {
136 my( $self, $server ) = @_;
137 my $xpath = "/opensrf/default|/opensrf/hosts/$server";
138 return $self->_get( $xpath );
141 sub get_default_config {
142 my( $self, $server ) = @_;
143 my $xpath = "/opensrf/default";
144 return $self->_get( $xpath );
147 sub get_bootstrap_config {
149 my $xpath = "/opensrf/bootstrap";
150 return $self->_get( $xpath );
153 sub get_router_config {
154 my( $self, $router ) = @_;
155 my $xpath = "/opensrf/routers/$router";
156 return $self->_get($xpath );