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