]> git.evergreen-ils.org Git - working/NCIPServer.git/blob - lib/NCIP.pm
Shifting the ILS call to NCIP.pm from Configuration.pm
[working/NCIPServer.git] / lib / NCIP.pm
1 package NCIP;
2 use NCIP::Configuration;
3 use NCIP::Handler;
4 use Modern::Perl;
5 use XML::LibXML;
6 use Try::Tiny;
7 use Module::Load;
8
9 use Object::Tiny qw{xmldoc config namespace ils};
10
11 our $VERSION = '0.01';
12 our $nsURI   = 'http://www.niso.org/2008/ncip';
13
14 =head1 NAME
15   
16     NCIP
17
18 =head1 SYNOPSIS
19
20     use NCIP;
21     my $nicp = NCIP->new($config_dir);
22
23 =head1 FUNCTIONS
24
25 =cut
26
27 sub new {
28     my $proto      = shift;
29     my $class      = ref $proto || $proto;
30     my $config_dir = shift;
31     my $self       = {};
32     my $config     = NCIP::Configuration->new($config_dir);
33     $self->{config}    = $config;
34     $self->{namespace} = $nsURI;
35
36     # load the ILS dependent module
37     my $module = 'NCIP::ILS::' . $config->('NCIP.ils.value');
38     load $module || die "Can not load ILS module $module";
39     my $ils = $module->new(  name => $config->('NCIP.ils.value')  );
40     $self->{'ils'} = $ils;
41     return bless $self, $class;
42
43 }
44
45 =head2 process_request()
46
47  my $response = $ncip->process_request($xml);
48
49 =cut
50
51 sub process_request {
52     my $self = shift;
53     my $xml  = shift;
54
55     my ($request_type) = $self->handle_initiation($xml);
56     unless ($request_type) {
57
58       # We have invalid xml, or we can't figure out what kind of request this is
59       # Handle error here
60         return;
61
62         #bail out for now
63     }
64     my $handler = NCIP::Handler->new( $self->namespace(), $request_type );
65     return $handler->handle( $self->xmldoc );
66 }
67
68 =head2 handle_initiation
69
70 =cut
71
72 sub handle_initiation {
73     my $self = shift;
74     my $xml  = shift;
75     my $dom;
76     try {
77         $dom = XML::LibXML->load_xml( string => $xml );
78     }
79     catch {
80         warn "Invalid xml, caught error: $_";
81     };
82     if ($dom) {
83
84         # should check validity with validate at this point
85         if ( $self->validate($dom) ) {
86             my $request_type = $self->parse_request($dom);
87
88             # do whatever we should do to initiate, then hand back request_type
89             if ($request_type) {
90                 $self->{xmldoc} = $dom;
91                 return $request_type;
92             }
93         }
94         else {
95             warn "Not valid xml";
96
97             # not valid throw error
98             return;
99         }
100     }
101     else {
102         return;
103     }
104 }
105
106 sub validate {
107
108     # this should perhaps be in it's own module
109     my $self = shift;
110     my $dom  = shift;
111     try {
112         $dom->validate();
113     }
114     catch {
115         warn "Bad xml, caught error: $_";
116         return;
117     };
118
119     # we could validate against the dtd here, might be good?
120     # my $dtd = XML::LibXML::Dtd->parse_string($dtd_str);
121     # $dom->validate($dtd);
122     # perhaps we could check the ncip version and validate that too
123     return 1;
124 }
125
126 sub parse_request {
127     my $self  = shift;
128     my $dom   = shift;
129     my $nodes = $dom->getElementsByTagNameNS( $nsURI, 'NCIPMessage' );
130     if ($nodes) {
131         my @childnodes = $nodes->[0]->childNodes();
132         if ( $childnodes[1] ) {
133             return $childnodes[1]->localname();
134         }
135         else {
136             return;
137         }
138     }
139     else {
140         warn "Invalid XML";
141         return;
142     }
143     return;
144 }
145
146 1;